微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

grep 多行 正则匹配

https://stackoverflow.com/questions/2686147/how-to-find-patterns-across-multiple-lines-using-grep

 

I relied heavily on pcregrep,but with newer grep you do not need to install pcregrep for many of its features. Just use grep -P.

In the example of the OP‘s question,I think the following options work nicely,with the second best matching how I understand the question:

grep -Pzo "abc(.|\n)*efg" /tmp/tes* grep -Pzl "abc(.|\n)*efg" /tmp/tes*

I copied the text as /tmp/test1 and deleted the ‘g‘ and saved as /tmp/test2. Here is the output showing that the first shows the matched string and the second shows only the filename (typical -o is to show match and typical -l is to show only filename). Note that the ‘z‘ is necessary for multiline and the ‘(.|\n)‘ means to match either ‘anything other than newline‘ or ‘newline‘ - i.e. anything:

[email protected]:~$ grep -Pzo "abc(.|\n)*efg" /tmp/tes* /tmp/test1:abc blah blah blah.. blah blah.. blah blah.. blah efg [email protected]:~$ grep -Pzl "abc(.|\n)*efg" /tmp/tes* /tmp/test1

To determine if your version is new enough,run man grep and see if something similar to this appears near the top:

 -P, --perl-regexp Interpret PATTERN as a Perl regular expression (PCRE, see below). This is highly experimental and grep -P may warn of unimplemented features.

That is from GNU grep 2.10.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐