用于查找和打印多行块的sed

用于查找和打印多行块的sed,sed,Sed,我的输入包含几个简单的多行块。块中的所有行都匹配某个图案,只有最后一行匹配不同的图案: some junk a1 some other junk a2 a3 a4 B some more junk a5 我要打印所有匹配的块(并抑制所有其他行): 我的想法是使用sed的保持缓冲区来实现这一点: sed -e '/a./H;/B/{H;x;p};d' 这几乎是因为它还打印没有必要的结束线的块: a1 a2 a3 a4 B 我的想法是在两种模式都不匹配的情况下清理保持缓冲区,但我找到了实现

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

some junk
a1
some other junk

a2
a3
a4
B

some more junk
a5
我要打印所有匹配的块(并抑制所有其他行):

我的想法是使用
sed的保持缓冲区来实现这一点:

sed -e '/a./H;/B/{H;x;p};d'
这几乎是因为它还打印没有必要的结束线的块:

a1
a2
a3
a4
B
我的想法是在两种模式都不匹配的情况下清理保持缓冲区,但我找到了实现这一点的方法。也许我对
sed
的理解太有限,看不到明显的方法。

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

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

如果一组行没有以所需的regexp开头,请丢弃这些行

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

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


注意:这取决于最后一行是否为空。

块是否总是用空行分隔?此代码是
awk-vrs='/^a.*B$/'
还是此代码
awk-vrs='/^(a.\n)+B$/'
帮助?如果没有,请添加更多详细信息使用
awk
的两种变体均无效。不,块之间不一定用换行符分隔。那么
perl-l-0777-ne'print/^(?:a.\n)+B$/mg'
怎么样?请注意,该模式基于给定的示例,您必须根据实际使用情况进行更改,是的。但是我更喜欢使用
sed
来完成任务,并设法使用hold缓冲区来完成任务,当然,我的实际用例比我问的问题要复杂一些,我觉得使用
sed
来完成任务可能非常简单。我只是想知道怎么做。(我本可以编写一个Python脚本来实现这一点,它看起来非常像您的Perl脚本。)branch是原始的,甚至Research-V7也有。尝试保存到文件,用换行符替换分号,并使用
-f
a1
a2
a3
a4
B
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