вывод одной команды является аргументом другой - PullRequest
1 голос
/ 06 мая 2010

Есть ли способ вписать в 1 линию, используя следующие трубы:

выход

sha1sum $(xpi) | grep -Eow '^[^ ]+'

идет вместо 456

sed 's/@version@/456/' input.txt > output.txt

Ответы [ 2 ]

2 голосов
/ 06 мая 2010

Хм, я думаю, вы можете вложить $ (command arg arg) вхождения, так что если вам действительно нужна только одна строка, попробуйте

 sed "s/@version@/$(sha1sum $(xpi) | grep -Eow '^[^ ]+')/" input.txt \
     > output.txt

Но мне нравится решение Трея, заключающееся в две строчки; это менее запутанно.

1 голос
/ 06 мая 2010

Это невозможно при использовании труб. Вложенность команд работает, хотя:

sed 's/@version@/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+')'/' input.txt > output.txt

Также обратите внимание, что если результаты вложенной команды содержат символ /, вам необходимо использовать другой символ в качестве разделителя (#, |, $ и _ - популярные) или как-нибудь избежать косой черты в вашей строке. В этом вопросе StackOverflow также есть решение проблемы побега. Эту проблему можно решить, отправив команду sed и заменив все прямые косые черты (для escape-символов) и обратную косую черту (чтобы избежать конфликтов с использованием / в качестве внешнего разделителя sed).

Следующее регулярное выражение будет экранировать все \ символов и все / символов в команде:

sha1sum $(xpi) | grep -Eow '^[^ ]+' | sed -e 's/\(\/\|\\\|&\)/\\&/g'

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

sed 's/@version@/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+'  | sed -e 's/\(\/\|\\\|&\)/\\&/g')'/' input.txt > output.txt

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

...