как использовать xargs с sed в шаблоне поиска

Мне нужно использовать вывод команды в качестве шаблона поиска в СЭД. Я приведу пример с использованием echo, но предположим, что это может быть более сложная команда:

echo "some pattern" | xargs sed -i 's/{}/replacement/g' file.txt

эта команда не работает, потому что "некоторый шаблон" имеет пробелы, но я думаю, что это ясно иллюстрирует мою проблему.

Как я могу заставить эту команду работать?

заранее спасибо,

4 ответов


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

sed -i "s/$(echo "some pattern")/replacement/g" file.txt

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


вам нужно сказать xargs, что заменить переключателем-I-он, похоже, не знает о {} автоматически, по крайней мере, в некоторых версиях.

echo "pattern" | xargs -I '{}' sed -i 's/{}/replacement/g' file.txt

это работает в Linux (протестировано):

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g' 

это может сработать для вас (GNU sed):

echo "some pattern" | sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt

по сути превратить some pattern в команду подстановки sed и подайте ее через канал к другому вызову sed. Последний вызов sed использует -f переключатель, который принимает команды sed через файл, файл в этом случае является стандартный ввод -.

если вы используете bash, то here-string можно использовать:

<<<"some pattern" sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt

N. B. сепараторы sed | и / не должно быть часть some pattern в противном случае регулярное выражение не будет формироваться правильно.