2010-05-06 70 views
1

参数是有任何方式,以适应在1行中使用管道以下:输出是另一个

输出的

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

去代替456

sed 's/@[email protected]/456/' input.txt > output.txt 
+0

您不能使用管道将输出获取到命令行参数中;给出的答案都有效,尽管我会用双引号(另一个)Jonathan的。 – 2010-05-06 03:58:49

+0

@Jonathan Leffler:sed在这些双引号中嵌套另一个命令不会很好地发挥作用。在shell试图解析出要执行的命令之前,它会尝试解析它。 – 2010-05-06 04:05:38

+0

@Trey:你是什么意思? ''(...)'表示法中的命令将在'sed'开始前完全执行! – 2010-05-06 04:24:56

回答

1

这是不可能使用管道。命令嵌套工作,但:

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 

就我个人而言,我认为这看起来像一条线,但它的工作原理。

+0

@Trey:是的,我知道那个,所以没有办法用'一行'来做,也许用管道呢? – Pablo 2010-05-06 03:32:30

+0

@迈克尔:对不起,我误解了你的问题。我只是修改它在一行工作。我不相信管道是可能的,因为你需要产生一个子命令,而不是直接将输出重定向到另一个命令的输入(这是管道的输入) – 2010-05-06 03:33:58

+0

@Trey:感谢您的更新,但分号场景也不起作用... – Pablo 2010-05-06 03:49:17

2

嗯,我想你可以巢$(命令ARG ARG)occurances,所以如果你真的只需要一条线,尽量

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

但我喜欢Trey的解决方案把它一个两行;它不那么令人困惑。

+0

@Trey:sed不会看到$; shell会执行'sha1sum $(xpi)| grep ...',然后试图用'sha1sum |的输出运行sed grep'嵌入命令行中。 – 2010-05-06 05:13:26

相关问题