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

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

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

Эта команда не работает, потому что у "some pattern" есть пробел, но я думаю, что это ясно иллюстрирует мою проблему.

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Это может сработать для вас (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. седельные разделители | и / не должны быть частью some pattern, иначе регулярное выражение не будет правильно сформировано.