在正常情况下,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
命令。但是,这没有用。
答案 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"