我试图通过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
答案 0 :(得分:0)
sed -n '/PAT1/{b A};b B; :A {N;/PAT2/b}; :B /PAT1/,/PAT2/p'
当看到PAT1时,转到分支A.在那里,读取下一行,如果它包含PAT2则再次开始。否则,在PAT1和PAT2之间打印行。
答案 1 :(得分:-1)
$ sed -n '/^PAT1/{N;/PAT2/d};/^PAT1/,/^PAT2/p' file
首先,如果在连续行中找到PAT1
和PAT2
,则删除,然后使用range
打印内容。
n N Read/append the next line of input into the pattern space.
答案 2 :(得分:-1)
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,则打印。