Если программа сокращает строки, необходимо присоединиться к ним перед запуском sed
. Например:
grep -rl "${SEARCH}" --include \*.pc ./ |
xargs sed -i "s/-$//; s/-\n//; s#${SEARCH}#${REPLACE}#g"
или
grep -rl "${SEARCH}" --include \*.pc ./ |
xargs perl -i -pe "s/-\n//; s#$SEARCH#$REPLACE#g"
Можно также использовать find
вместо grep
:
find -type f -name '*.pc' -exec perl -i -pe "s/-\n//; s#$SEARCH#$REPLACE#g" {} +
.
-121--289312- GNU grep
имеет возможность исключить глобусы из своих встроенных рекурсивных поисков. Попробуйте:
grep -iHrn --exclude='*.c' --exclude='*.h' TRACE_WANTED
Выполняется рекурсивный поиск, начиная с текущего каталога, аналогично команде find
. Он исключает все файлы * .c
и * .h
.
Если все, что вам нужно, это найти файлы, которые содержат слово TRACE_WANTED, исключая файлы * .c и * .h, вам даже не нужно использовать find , grep в одиночку может сделать эту работу для вас:
grep -r --exclude={"*.c","*.h"} TRACE_WANTED ./
Кавычки не нужны в bash, но необходимы в zsh по умолчанию.
Оригинал:
<
нужны файлы или дескрипторы файлов, в то время как у вас есть подстановка команды -, которая заменяет любые обратные кавычки строкой текста.
Для ваших целей лучше использовать подстановку процесса в bash
. Примерно так:
gmx --stdin < <(node e "console.log('foo')")
Или другой пример для ясности:
wc -l < <(df)
Редактировать:
Чтобы передать строковый литерал, представляющий команду, вы можете использовать:
gmx --stdin <<< "$(echo node -e $'"console.log(\'foo\')"' )"
$'...'
позволяет цитировать C -, что и делает часть \'foo\'
.
Здесь в основном тот же пример, но вместо него используется канал (, который может не работать, если для команды требуется lseekable ввод)
$ touch with\ space
$ echo stat $'\'with space\''
stat 'with space'
$ echo stat $'\'with space\'' | sh
File: with space
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1069455 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 1000/ xie) Gid: ( 1000/ xie)
Access: 2018-05-07 05:01:37.638553045 +0800
Modify: 2018-05-07 05:01:37.638553045 +0800
Change: 2018-05-07 05:01:37.638553045 +0800
Birth: -
Кроме того, существует способ работы с цитированием через printf %q
, который из help printf
описывается как:
quote the argument in a way that can be reused as shell input
Таким образом, потенциальное решение
printf '%q' 'node -e "conlose.log('foo')"' | gmx --stdin
или
gmx --stdin <<< "$( printf '%q' 'node -e "conlose.log('foo')"' )"
Оказывается, все, что мне нужно было сделать, это сделать это:
gmx --stdin <<EOF
node e "console.log('foo')"
EOF
, который считывал бы строку, начинающуюся с node
, как строковый литерал, в стандартный ввод команды gmx.