当两个图案之间至少有一条线时,通过sed / AWK打印两个图案之间的线条

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当两个图案之间至少有一条线时,通过sed / AWK打印两个图案之间的线条相关的知识,希望对你有一定的参考价值。

我试图通过sed命令在两个模式之间打印行。但是当我们之间有一些线时,我想在结果中包含包含Pattern1 Pattern2的行。如果Pattern1和Pattern2之间没有线,则从文件中排除Pattern1和Pattern2的行。

PAT1
XXX
XXX
PAT2
PAT1
XX
PAT2
PAT1
PAT2
PAT1
XXX
PAT2

所需的输出是:

PAT1
XXX
XXX
PAT2
PAT1
XX
PAT2
PAT1
XXX
PAT2
答案
sed -n '/PAT1/{b A};b B; :A {N;/PAT2/b}; :B /PAT1/,/PAT2/p'

当看到PAT1时,转到分支A.在那里,读取下一行,如果它包含PAT2则再次开始。否则,在PAT1和PAT2之间打印行。

另一答案

这可能适合你(GNU sed):

sed -n '/^PAT1/{:a;N;/^PAT2/M!ba;/\n.*\n/p}' file

收集两个图案之间的线条,只有在图案之间至少有一条线条时才打印。

要么:

sed '/^PAT1/h;//!H;/^PAT2/!d;x;/\n.*\n/!d' file

如果一行以第一个模式开头,则替换保留空间中的任何内容。否则将该行附加到保留空间。如果该行不以第二个模式开头,请将其删除。否则,交换到保留空间并删除它,如果没有至少三行。

另一答案
$ sed -n '/^PAT1/{N;/PAT2/d};/^PAT1/,/^PAT2/p' file

首先,如果在连续的行中找到PAT1PAT2,则删除,然后使用range打印内容。

 n N    Read/append the next line of input into the pattern space.
另一答案

awk救援!

$ awk '/PAT1/        {c=1; out=""} 
       /PAT2/ && c>2 {print out $0} 
       c&&c++        {out=out $0 ORS}' file

PAT1
XXX
XXX
PAT2
PAT1
XX
PAT2
PAT1
XXX
PAT2

我认为它可以进一步简化,但现在作为要求阅读。从PAT1开始,聚合行直到PAT2,如果行数大于2则打印。

以上是关于当两个图案之间至少有一条线时,通过sed / AWK打印两个图案之间的线条的主要内容,如果未能解决你的问题,请参考以下文章

5299. [CQOI2018]解锁屏幕状压DP

BZOJ5299CQOI2018解锁屏幕(动态规划,状态压缩)

动态凸壳技巧

确切的元素位置 actionscript3

在 2 个 div 之间连接一条线

POJ3177 分离的路径