只有当另一个图案包含在两个图案之间时,如何打印该范围的线条



我正在Linux上处理文本文件。我希望能够打印两个图案之间的所有线条(包括找到图案的线条(,只有在这些线条中找到另一个图案的情况下。

例如:

PatternStart
line1
line2
PatternInside
line3
line4
PatternEnd
PatternStart
line1
line2
line3
PatternEnd

我只想得到第一行,因为它包含PatternInside。现在,我所能做的就是用提取边界图案之间的线

awk '/PatternStart/,/PatternEnd/' file

但这将提取两条线段。

您可以使用

awk 'flag{
buf = buf $0 ORS;
if (/PatternEnd/ && buf ~ /PatternInside/)
{printf "%s", buf; flag=0; buf=""}
}
/PatternStart/{buf = $0 ORS; flag=1}' file

这里,/PatternStart/{buf = $0; flag=1}'找到与PatternStart模式匹配的行,开始将输出值写入buf,并设置标志。如果标志为true,则后续行被附加到buf,并且一旦存在PatternEnd匹配的行并且PatternInsidebuf中找到匹配,则打印匹配,buf被清除并且标志被重置。

查看产生的在线演示

PatternStart
line1
line2
PatternInside
line3
line4
PatternEnd

这可能对你有用(GNU sed(:

sed -n '/PatternStart/{:a;N;/PatternEnd/!ba;/PatternInside/p}' file

通过设置-n关闭隐式打印。

匹配PatternStart,追加后续行,直到匹配PatternEnd,然后检查集合中的字符串PatternInside,如果是,则打印集合。

使用货舱的另一种解决方案:

sed -n 'H;/PatternStart/h;/PatternEnd/{g;/PatternInside/p}' file

如果块之间有空行

$ awk -v RS= '/^PatternStart.*PatternInside.*PatternEnd$/' file
PatternStart
line1
line2
PatternInside
line3
line4
PatternEnd

最新更新