Как я использую новые строки внутри () с sed?

Та ошибка была вызвана просто тире, находящимся в неправильном месте ("вводят-f" по сравнению с "-тип f"). Используйте:

truncate -s 0 $(find . -size +1c -type f -exec grep -LwE 'keyword1|keyword2|keyword3' {} +)

Обработать имена файлов с пробелами:

find . -size +1c -type f -exec grep -LwE 'keyword1|keyword2|keyword3' {} + | while IFS= read -r fname ; do truncate -s 0 "$fname" ; done
2
28.11.2014, 18:46
4 ответа

, Вероятно, самый эффективный способ сделать это - поскольку я рассматриваю это - с оценка . Если вы хотите литеральные значения из расширения оболочки затем, самый простой способ получить их вне литерального входа - и единственный способ вытащить, это из вывода оболочки должно подать его назад в.

является обычно самым легким работать с ' твердые кавычки. Простое правило кавычки для ' трудно заключенный в кавычки ' последовательность - то, что оно не может содержать твердую кавычку - единственный способ получить тот, интерпретируемый в таком контексте, состоит в том, чтобы связать 2 или больше заключенных в кавычки последовательности вместе как...

VAR='string'\''more string'

Таким образом первые заключенные в кавычки концы последовательности во второй кавычке, вторая заключенная в кавычки последовательность является только единственной оставленной из обратной косой черты твердой кавычкой, и треть является четвертой твердой кавычкой через конец.

И поэтому то, что я мог бы сделать, если бы были вы...

eval "lol='$(nl='\
';    printf %s\\n "$lol" |
      sed "s/Dot/&$nl/g
           s/'"'/&\\&&/g
          $s/$/'"'/
")"

Таким образом та же запаздывающая новая строка, которую printf добавляет к значению var, является той, которую замена команды разделяет - который является также последним знаком в выводе, потому что предпоследний символ всегда является твердой кавычкой - и это безопасно разграничивает оценка оператор, потому что sed выходит из любых твердых кавычек, которые могут появиться в его входе и существует один во главе последовательности.

, По правде говоря, тем не менее, использующие замены команды как этот часто являются не хорошей практикой так или иначе - и возможно именно поэтому она не соответствует совершенно верно всему времени.Обычно более эффективно собрать весь вывод от процесса для каждого из его циклов процесса, и исчезать это сразу на едином потоке к другому фильтру обрабатывает в конвейере, чем это - к пятицентовой-монете-и-десяти-центов фильтры таким образом.

И если у вас нет огромных значений в ваших переменных оболочки - который является также обычно плохой идеей - что-то вроде этого - вероятно, лучший способ пойти:

set -- "$lol" 
while case "$1" in (*Dot*)
set -- "${1%Dot*}" "${1##*Dot}Dot
$2";;(*) ! lol=$1$2;; esac
do :; done
1
27.01.2020, 22:05

Вы можете использовать новую строку \n вместе с возвратом каретки \r. У меня под рукой нет BSD sed для тестирования, но он работает с GNU sed.

$ var=Dot
$ lol=$(echo $var | sed 's/Dot/Dot\n\r/g')
$ echo "$lol"
Dot

$

Если BSD sed не поддерживает \r, то другое (довольно уродливое) решение - распечатать \n\r с помощью echo -e или printf:

lol=$(echo $var | sed "s/Dot/Dot\\$(printf '\n\r')/g")
0
27.01.2020, 22:05

Shell Удаляет трейлинные новости. Обычный обходной путь состоит в том, чтобы добавить персонажа в самом конце в замене команд, а затем удалить его.

x=$( echo a; echo ; echo :)
echo "${x%:}"
1
27.01.2020, 22:05

А как насчет методов, упомянутых в этом опросе Stackoverflow под заголовком: Как использовать замену новой строки в BSD sed?:

sed -e 's/ /\'$'\n/g'

Или другой метод, упомянутый там, где вы помещаете новую строку в переменную типа так:

cr="
"

Тогда используйте переменную:

sed "s/ /\\${cr}/g"
1
27.01.2020, 22:05

Теги

Похожие вопросы