我最近才开始学习regex。我的第一次入侵是通过Windows上的Notepad++搜索和替换对话框。现在,我意识到使用其他工具来匹配跨行模式似乎并不容易。在Notepad++中,我只使用\n。
使用Perl在命令行处理正则表达式,如果使用"slurp模式“,则相对容易。我可以用这样的台词
perl -0777 -pe 's/pattern/replace-text/' foo.txt
“模式”可以有我需要的多少\n。
对于Linux命令行,可以使用包含(\r)\n的regexes的选项有哪些?对我来说,文本跨行中的匹配模式特别重要。
发布于 2015-07-30 04:12:15
如果您安装了Perl兼容的正则表达式,请查看pcregrep。(如果安装了pcre2,它将是pcre2grep。)无论如何,如果手册页也已安装,请查看破折号-M(拉丁文大写字母M)选项,它将允许您在多行上进行匹配。如果您没有安装手册页,您可以转到pcre-dot,所有文档都在那里。
下面是几个示例,但是首先,输入文件:
$ cat malt
this is foo
bar baz
this is foo'd up
beyond all barz
this is foo
bar
foo
bar
blah blah foobar blah
现在,一个匹配换行符的正则表达式,如您的示例中所示:
$ pcregrep -M 'foo\nbar' malt
this is foo
bar baz
对于下面的内容,我将使用dash-n选项(与grep: print行号相同)来更清楚地显示有多少匹配,以及匹配的第一部分发生在哪一行。在这里,我试图匹配"foo“后面的一个换行符,零或多个空格(即,可选的),然后是"bar":
$ pcregrep -nM 'foo\n\s*bar' malt
1:this is foo
bar baz
7:this is foo
bar
10:foo
bar
这一次(使用可选的空格),我们匹配了三次,分别从第1行、第7行和第10行开始。另一个考虑是,如果你想要点(句号)匹配线中断或不。这可以通过(?s)
模式修饰符来完成,例如:
$ pcregrep -nM '(?s:foo.*bar)' malt
1:this is foo
bar baz
this is foo'd up
beyond all barz
this is foo
bar
foo
bar
blah blah foobar blah
请务必阅读“贪婪”与“懒惰”匹配模式。请注意上面的匹配一次,从第1行的"foo“开始:一直到文件上的最后一条。与“懒惰”消费的工作方式相比,这种差异是显著的--我们可以使用?
量化行为修饰符这样做:
$ pcregrep -nM '(?s:foo.*?bar)' malt
1:this is foo
bar baz
4:this is foo'd up
beyond all barz
7:this is foo
bar
10:foo
bar
13:blah blah foobar blah
后者与前者的表达方式相同,只是与“?”懒惰行为修饰语
https://stackoverflow.com/questions/31690021
复制相似问题