我如何找到一种模式,然后是第二个模式,然后仅在第二个模式使用sed之后附加文本



我试图在文件中找到一个模式,然后找到第二个模式,然后仅在第二个模式之后添加文本。

例如,如果这是我要更改的文件中的文本:

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的范围。命令的其余部分与以前一样。

相关内容

  • 没有找到相关文章

最新更新