繁体   English   中英

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

[英]Print lines between two patterns through sed/AWK when there is at least one line between them

我试图通过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

首先,如果在连续的行中找到PAT1PAT2PAT2其删除,然后使用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,则打印。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM