Regex Linux命令行正则表达式处理工具,方便多行操作?

Regex Linux命令行正则表达式处理工具,方便多行操作?,regex,command-line,Regex,Command Line,我最近才开始学习正则表达式。我的第一次入侵是通过Windows上的Notepad++搜索和替换对话框。现在我意识到,使用其他工具跨行匹配模式似乎并不那么容易。在记事本++中,我只使用\n 使用Perl在命令行中处理正则表达式,如果使用“slurp模式”,我会相对轻松。我可以用一条像这样的线 perl -0777 -pe 's/pattern/replace-text/' foo.txt “模式”可以有我需要的任意数量 对于Linux命令行,我可以使用包含(\r)\n的正则表达式,有哪些替代方法

我最近才开始学习正则表达式。我的第一次入侵是通过Windows上的Notepad++搜索和替换对话框。现在我意识到,使用其他工具跨行匹配模式似乎并不那么容易。在记事本++中,我只使用\n

使用Perl在命令行中处理正则表达式,如果使用“slurp模式”,我会相对轻松。我可以用一条像这样的线

perl -0777 -pe 's/pattern/replace-text/' foo.txt
“模式”可以有我需要的任意数量


对于Linux命令行,我可以使用包含(\r)\n的正则表达式,有哪些替代方法?文本行中的匹配模式对我来说尤其重要。

如果您安装了与Perl兼容的正则表达式,请查看pcregrep。(如果您安装了pcre2,它将是pcre2grep。)无论如何,如果手册页面也安装了,请查看dash-M(拉丁文大写字母M)选项,该选项将允许您在多行上进行匹配。如果您没有安装手册页,可以转到pcre.org,所有文档都在那里

下面是几个示例,但首先是输入文件:

$ 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
$ 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
对于以下内容,我将使用dash-n选项(与grep:print line number相同)来更清楚地显示有多少个匹配项,以及匹配的第一部分发生在哪一行。在这里,我试图匹配“foo”,后跟一个换行符、零个或多个空格(即可选),然后是“bar”:

这一次(可选空白),我们匹配了三次,分别从第1行、第7行和第10行开始。另一个需要考虑的问题是,您是否希望点(句号)匹配线中断。这可以通过
(?s)
模式修改器完成,例如:

$ pcregrep -M 'foo\nbar' malt
this is foo
bar baz
$ 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

后一个表达式与前一个表达式相同,只是带有'?'惰性行为修饰符。

Perl应该接受模式中的
\n
,不好!感谢您的详细帖子和一般建议。从我到目前为止收集的资料来看,似乎没有比这更容易的了。非常感谢。