多行,重复出现匹配

时间:2016-02-25 01:36:28

标签: regex sed grep cygwin

我参考下面的问题,但有点不同。我只需要获得有" abc"当有" efg"在不同的线上匹配。我只需要最新匹配的" abc"排在" efg"匹配...

How to find patterns across multiple lines using grep?

blah blah..
blah blah..
blah abc blah1
blah blah..
blah blah..
blah abc blah2
blah blah..
blah efg1 blah blah
blah efg2 blah blah
blah blah..
blah blah..

blah abc blah3
blah blah..
blah blah..
blah abc blah4
blah blah..
blah blah blah

blah abc blah5
blah blah..
blah blah..
blah abc blah6
blah blah..
blah efg3 blah blah

blah efg4 blah blah
blah abc blah7
blah blah..
blah blah..
blah abc blah8
blah blah..

预期输出

blah abc blah2
blah abc blah6

2 个答案:

答案 0 :(得分:0)

我可以通过两个步骤看到如何执行此操作,一个用于识别abc ... efg群集的块,但具有多个前者。第二步是剥离重要的两条线。

重要提示:确保输入\n\n中没有空行对,因为这会打破perl步骤。

grep -Pzo '(.*abc.*)\n(.*\n)*?(.*efg.*\n)' text | perl -0777 -pe 's/(.+\n)*(.*abc.*\n)(.+\n)*?(.*efg.*\n)\n/$2$4/g'

例如:

grep -Pzo '(.*abc.*)\n(.*\n)*?(.*efg.*\n)' text
blah abc blah1
blah blah..
blah blah..
blah abc blah2
blah blah..
blah efg1 blah blah

blah abc blah3
blah blah..
blah blah..
blah abc blah4
blah blah..
blah blah blah
blah abc blah5
blah blah..
blah blah..
blah abc blah6
blah blah..
blah efg3 blah blah

查看efg块如何被两个换行符隔开?然后,我们使用perl搜索和替换正则表达式删除无关紧要的内容:

$ grep -Pzo '(.*abc.*)\n(.*\n)*?(.*efg.*\n)' text | perl -0777 -pe 's/(.+\n)*(.*abc.*\n)(.+\n)*?(.*efg.*\n)\n/$2$4/g'
blah abc blah2
blah efg1 blah blah
blah abc blah6
blah efg3 blah blah

如果您只想要abc行,只需在替换块中加入$2(删除$4)。

$ grep -Pzo '(.*abc.*)\n(.*\n)*?(.*efg.*\n)' text | perl -0777 -pe 's/(.+\n)*(.*abc.*\n)(.+\n)*?(.*efg.*\n)\n/$2/g'
blah abc blah2
blah abc blah6

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -n '/abc/h;/efg/!b;x;/abc/p;z;x' file

将最新的abc行存储在保留空间(HS)中。遇到包含efg的行时,请切换到HS,如果该行包含abc则打印出来。

相关问题