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