参数是有任何方式,以适应在1行中使用管道以下:输出是另一个
输出的sha1sum $(xpi) | grep -Eow '^[^ ]+'
去代替456
sed 's/@[email protected]/456/' input.txt > output.txt
参数是有任何方式,以适应在1行中使用管道以下:输出是另一个
输出的sha1sum $(xpi) | grep -Eow '^[^ ]+'
去代替456
sed 's/@[email protected]/456/' input.txt > output.txt
这是不可能使用管道。命令嵌套工作,但:
sed 's/@[email protected]/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+')'/' input.txt > output.txt
还要注意的是,如果嵌套的命令的结果包含/
字符,你需要使用不同的字符作为分隔符(#
,|
,$
和_
是流行的)或以某种方式逃避你的字符串中的正斜线。 This StackOverflow question也有逃避问题的解决方案。通过将命令输送到sed并替换所有正斜杠(用于转义字符)和反斜杠(以避免与使用/
作为外部sed分隔符时发生冲突),可以解决问题。
下面的正则表达式将难逃所有\
字符,并在命令所有/
字符:
sha1sum $(xpi) | grep -Eow '^[^ ]+' | sed -e 's/\(\/\|\\\|&\)/\\&/g'
嵌套这正如我们前面所做的那样,我们得到这个解决方案需要的地方应适当逃脱斜线:
sed 's/@[email protected]/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+' | sed -e 's/\(\/\|\\\|&\)/\\&/g')'/' input.txt > output.txt
就我个人而言,我认为这看起来像一条线,但它的工作原理。
嗯,我想你可以巢$(命令ARG ARG)occurances,所以如果你真的只需要一条线,尽量
sed "s/@[email protected]/$(sha1sum $(xpi) | grep -Eow '^[^ ]+')/" input.txt \
> output.txt
但我喜欢Trey的解决方案把它一个两行;它不那么令人困惑。
@Trey:sed不会看到$; shell会执行'sha1sum $(xpi)| grep ...',然后试图用'sha1sum |的输出运行sed grep'嵌入命令行中。 – 2010-05-06 05:13:26
您不能使用管道将输出获取到命令行参数中;给出的答案都有效,尽管我会用双引号(另一个)Jonathan的。 – 2010-05-06 03:58:49
@Jonathan Leffler:sed在这些双引号中嵌套另一个命令不会很好地发挥作用。在shell试图解析出要执行的命令之前,它会尝试解析它。 – 2010-05-06 04:05:38
@Trey:你是什么意思? ''(...)'表示法中的命令将在'sed'开始前完全执行! – 2010-05-06 04:24:56