我正在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
匹配的行并且PatternInside
在buf
中找到匹配,则打印匹配,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