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