首页 文章

管道里面的sed

提问于
浏览
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 .

2 回答

  • 4

    tr 命令在文本"<\0>"上运行,而不在"<Test>"上运行 . 在管道完成之前,后向引用不会在 sed 中展开 . 你的第二个例子相当于

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

    这里看起来更容易 tr 无法在输入中看到"Test" .

  • 1

    使用GNU sed和 e 标志可以达到效果:

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

    输出:

    <Text ....>
    

相关问题