重写sed命令以编辑流而不是文件

时间:2014-09-18 15:38:01

标签: bash shell sed

在正常情况下,sed可以通过管道来编辑来自另一个命令的流:

./somecommand | sed 's/xx/yy/g'

但是,我使用的sed命令有点复杂。以前,我已经获得了针对特定用例优化sed的帮助: Optimize shell script for multiple sed replacements

最终的结果是,对于我的用例,以下sed命令是最优的:

./somecommand > file
sed -e 's/^/s|/; s/$/|g/;' replacement_list | sed -r -f - -i file

基本上,第一个sed命令从具有成对子对的文件中创建sed操作列表。然后,第二个sed命令通过管道使用流,并使用-f选项处理文件。

事情发生了一些变化,现在我已经设法让somecommand输出结果stdout而不是写入文件,但我想不出有办法重写上面的命令集正确。部分困难是第二个sed命令已经在使用第一个sed命令中的流。

我尝试过的一件事是将stdout somecommand分配给变量并尝试<<<进入第二个sed命令。但是,这没有用。

1 个答案:

答案 0 :(得分:1)

你可以通过使用shell的内联扩展来解决这个问题(我认为这就是它的所谓,如果我错了,请纠正我。)

./somecommand | sed -r -e "`sed -e 's/^/s|/; s/$/|g/;' replacement_list`"

注意双引号内的反引号,这将导致内部sed命令的stdout放在双引号内。

虽然这很危险,所以你可能想尝试将内部sed命令的输出首先保存到shell变量

sedcommand="`sed -e 's/^/s|/; s/$/|g/;' replacement_list`"
./somecommand | sed -r -e "$sedcommand"