管道里面的sed

时间:2012-08-27 14:15:16

标签: bash sed

有没有办法将SED s ///命令的反向引用发送到管道?要从文本中获取条目,请更改它,然后将其写回。我发现SED中的替换有效:

$ echo 'Test ....' | sed 's/Test/'$( echo "<\0>" )'/' 
<Test> ....

但是第一个管道没有:

$ echo 'Test ....' | sed 's/Test/'$( echo "<\0>" | tr 's' 'x' )'/' 
<Test> ....

是什么原因?另外,我无法理解为什么这个有用。我认为应该在sed之前处理$()替换(尤其是当我打破引号时)。

如何使用sed将一个s ///命令插入另一个命令?我用bash。

2 个答案:

答案 0 :(得分:4)

tr命令对文本“&lt; \ 0&gt;”进行操作,而不是对“&lt; Test&gt;”进行操作。在管道完成之前,后向引用不会在sed中展开。你的第二个例子相当于

foo=$( echo "<\0>" | tr 's' 'x' )
echo 'Test ....' | sed 's/Test/'$foo'/'

这里更容易看到tr无法在其输入中看到“测试”。

答案 1 :(得分:1)

你可以用GNU sed和e标志来达到你想要的效果:

echo 'Test ....' | sed 's/Test.*/echo "<\0>" | tr s x/e'

输出:

<Text ....>