Та ошибка была вызвана просто тире, находящимся в неправильном месте ("вводят-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 или больше заключенных в кавычки последовательности вместе как...
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
Вы можете использовать новую строку \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")
Shell Удаляет трейлинные новости. Обычный обходной путь состоит в том, чтобы добавить персонажа в самом конце в замене команд, а затем удалить его.
x=$( echo a; echo ; echo :)
echo "${x%:}"
А как насчет методов, упомянутых в этом опросе Stackoverflow под заголовком: Как использовать замену новой строки в BSD sed?:
sed -e 's/ /\'$'\n/g'
Или другой метод, упомянутый там, где вы помещаете новую строку в переменную типа так:
cr="
"
Тогда используйте переменную:
sed "s/ /\\${cr}/g"