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

7

我有一个名为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"之前的每个最后一次出现"abc"和"efg"之间的行。对于上面的例子,我想要输出:
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”的出现开始,而不是最后一个,“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" 开始吗?

1个回答

6
这可能适用于您(GNU sed):
sed -n '/\<abc\>/,/\<efg\>/{/\<abc\>/{h;d};H;/\<efg\>/{x;p}}' file

3
我进行了一些搜索以理解这个问题,如果我理解有误请纠正我:1、转义的尖括号是可选的,它们表示我们要查找的是单词。2、'h'命令表示将模式空间保存到保持缓冲区中,'H'表示将模式空间追加到保持缓冲区中,'x'表示交换模式空间和保持缓冲区。3、整个命令首先选择以包含'abc'的第一行开头并以下面第一行包含'efg'结束的范围,然后在每个范围内查找包含'abc'的最后一行,并保存直到包含'efg'的行,然后打印它们。 - poiu2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接