一个命令的输出是另一个命令的参数

时间:2010-05-06 03:25:45

标签: unix shell sed pipe

使用以下管道是否有任何方法可以放入1行:

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

而不是456

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

2 个答案:

答案 0 :(得分:2)

嗯,我认为你可以嵌套$(命令arg arg),所以如果真的只需要一行,试试

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

但是我喜欢Trey的解决方案,只需两行;它不那么令人困惑。

答案 1 :(得分:1)

使用管道无法做到这一点。命令嵌套有效:

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

另请注意,如果嵌套命令的结果包含/字符,则需要使用其他字符作为分隔符(#|$,并且_很受欢迎)或以某种方式逃脱字符串中的正斜杠。 This StackOverflow question也有解决逃逸问题的方法。可以通过将命令传递给sed并替换所有正斜杠(用于转义字符)和反斜杠(以避免与使用/作为外部sed分隔符冲突)来解决此问题。

以下正则表达式将转义命令中的所有\个字符和所有/个字符:

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

如上所述嵌套这个我们得到的解决方案应该在需要时正确地转义斜杠:

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

就我个人而言,我认为这看起来像一条混乱,但它确实有效。