首页 > 解决方案 > sed 用于查找和打印多行块

问题描述

我的输入包含几个简单的多行块。块中的所有行都匹配某个模式,只有最后一行匹配不同的模式:

some junk
a1
some other junk

a2
a3
a4
B

some more junk
a5

我想打印所有匹配的块(并禁止所有其他行):

a2
a3
a4
B

我的想法是使用 Hold Buffersed来实现这一点:

sed -e '/a./H;/B/{H;x;p};d'

几乎可以工作,因为它还打印没有必要的结束行的块:

a1
a2
a3
a4
B

我的想法是在两种模式都不匹配时清理保持缓冲区,但我找到了实现这一目标的方法。也许我的理解sed太有限,看不到明显的方法。

标签: sed

解决方案


这可能对您有用(GNU sed):

sed -n '/a./!{:a;n;/\S/ba;b};h;:b;n;H;/a./bb;/\S/!b;/B/!ba;n;H;/\S/ba;x;p' file

-n使用该选项关闭隐式打印。

如果一组行不是以所需的正则表达式开头,则丢弃这些行。

否则,在保留空间中收集这些行,直到正则表达式失败,然后如果下一行包含第二个正则表达式并且后面的行为空,则将这两行附加到保留空间,交换到保留空间并打印该组的行。重复。

对于所有其他情况,不要打印任何行。

注意这取决于最后一行是空的。


推荐阅读