1

有没有办法将 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。

4

2 回答 2

4

tr命令对文本“<\0>”进行操作,而不是对“<Test>”进行操作。sed直到管道完成后,反向引用才会展开。你的第二个例子相当于

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

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

于 2012-08-27T14:18:46.220 回答
2

您可以使用 GNU sed 和e标志来实现您想要的效果:

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

输出:

<Text ....>
于 2012-08-27T15:16:14.800 回答