Чтение литерала из stdin- Ошибка неоднозначного перенаправления при использовании EOF

Если программа сокращает строки, необходимо присоединиться к ним перед запуском 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 .

-121--119414-

Если все, что вам нужно, это найти файлы, которые содержат слово TRACE_WANTED, исключая файлы * .c и * .h, вам даже не нужно использовать find , grep в одиночку может сделать эту работу для вас:

 grep -r --exclude={"*.c","*.h"} TRACE_WANTED ./

Кавычки не нужны в bash, но необходимы в zsh по умолчанию.

0
06.05.2018, 23:40
2 ответа

Оригинал:

<нужны файлы или дескрипторы файлов, в то время как у вас есть подстановка команды -, которая заменяет любые обратные кавычки строкой текста.

Для ваших целей лучше использовать подстановку процесса в 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')"' )"
1
28.01.2020, 02:32

Оказывается, все, что мне нужно было сделать, это сделать это:

gmx --stdin <<EOF
   node e "console.log('foo')"
EOF

, который считывал бы строку, начинающуюся с node, как строковый литерал, в стандартный ввод команды gmx.

1
28.01.2020, 02:32

Теги

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