使用sed查找两个模式之间的线

使用sed查找两个模式之间的线,sed,Sed,我在text.txt中的行如下所示: blah blah.. blah abc blah.. blah abc blah blah blah.. blah blah.. blah blah.. blah efg blah blah blah blah.. blah abc blah blah abc blah blah abc blah blah abc blah blah abc blah blah blah.. blah efg blah blah blah blah.. blah blah

我在text.txt中的行如下所示:

blah blah..
blah abc blah..
blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah blah..
blah abc blah
blah abc blah
blah abc blah
blah abc blah
blah abc blah
blah blah..
blah efg blah blah
blah blah..
blah blah..
我想输出“efg”和“efg”之前最后一次出现的“abc”之间的行,对于上面的示例,我想输出:

blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah abc blah
blah blah..
blah efg blah blah
我知道sed可以使用两种模式选择范围,如:

sed -n '/abc/,/efg/p' test.txt
但是,输出将从第一次出现的“abc”开始,而不是最后一次,输出如下:

blah abc blah..
blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah abc blah
blah abc blah
blah abc blah
blah abc blah
blah abc blah
blah blah..
blah efg blah blah
我可以在命令行上进行任何增强,以便从最后一次出现的“abc”开始输出?

这可能适合您(GNU-sed):

sed-n'/\/,/\/{/\/{h;d};h;/\/{x;p}}文件

为了理解这一点,我做了一些搜索,如果我错了,请纠正我:1、转义尖括号是可选的,表示我们要查找的是单词。2、'h'命令表示将模式空间保存到保持缓冲区,'h'表示将模式空间追加到保持缓冲区,'x'表示交换模式空间和保持缓冲区。3、整个命令将首先选择以第一行包含“abc”开始,以下一行包含“efg”结束的范围,然后在每个范围中找到最后一行包含“abc”,并保存下一行,直到该行包含“efg”,并打印它们
sed -n '/\<abc\>/,/\<efg\>/{/\<abc\>/{h;d};H;/\<efg\>/{x;p}}' file