我参考下面的问题,但有点不同。我只需要获得有" 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
答案 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
则打印出来。