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

poi*_*000 7 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..
Run Code Online (Sandbox Code Playgroud)

我想在"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
Run Code Online (Sandbox Code Playgroud)

我知道sed可以使用两种模式选择范围,例如:

sed -n '/abc/,/efg/p' test.txt
Run Code Online (Sandbox Code Playgroud)

但是输出将从第一次出现的"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
Run Code Online (Sandbox Code Playgroud)

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

pot*_*ong 6

这可能适合你(GNU sed):

sed -n '/\<abc\>/,/\<efg\>/{/\<abc\>/{h;d};H;/\<efg\>/{x;p}}' file
Run Code Online (Sandbox Code Playgroud)

  • 我做了一些搜索来理解这一点,如果我错了就纠正我:1,转义尖括号是可选的,它表示我们要找的是单词.2,'h'命令表示将模式空间保存到保持缓冲区,'H'表示将模式空间附加到保持缓冲区,'x'表示交换模式空间和保持缓冲区.3,整个命令首先选择以第一行开头的范围包含'abc'并以第一行结尾包含'efg',然后在每个范围内找到最后一行包含'abc',并保存以下行直到该行包含'efg',然后打印它们 (3认同)