我试图在文件中找到一个模式,然后找到第二个模式,然后仅在第二个模式之后添加文本。
例如,如果这是我要更改的文件中的文本:
aaa
bbb
ccc
ddd
eee
fff
ggg
我想匹配" AAA",然后是" DDD",然后在" DDD"之后将" Hello"添加到线上。
我尝试了
sed -i "/aaa/,/ddd/ahello" foo.txt
但是我最终得到的是:
aaa
hello
bbb
hello
ccc
hello
ddd
hello
eee
fff
ggg
编辑:另外,是否有一种方法可以确保仅发生一次,或仅在第一次出现第二种模式之后(示例中的" ddd")?
这可能对您有用(gnu sed):
sed '/aaa/,/ddd/!b;/ddd/ahello' file
编辑:
如果您希望它仅在文件中发生一次:
sed 'x;/./{x;b};x;/aaa/,/ddd/!b;/ddd/!b;h;ahello' file
请参阅John1024解决方案,以优雅地使用bash和sed。
n.b。如果可能的话,我会删除此答案,但不允许删除可接受的答案。
sed $'/aaa/,/ddd/ { /ddd/ ahellon }' patterns
括号中的命令在匹配DDD的任何行之后添加了行Hello。但是,牙套中的命令仅应用于AAA和DDD之间的线。
另外,使用替代而不是添加:
sed '/aaa/,/ddd/ s/ddd/dddnhello/' patterns
这会产生:
aaa
bbb
ccc
ddd
hello
eee
fff
ggg
此版本仅在AAA线发生后才限制替代。
替代方案:假设我们只想在DDD首次出现后添加Hello,并且只有事先发生AAA。在这种情况下:
sed $'0,/ddd/ {/aaa/,/ddd/ { /ddd/ ahellon}}' patterns
第一个范围指示符0,/ddd/
将所有内容的范围限制为直至第一次出现DDD的范围。命令的其余部分与以前一样。