发布
社区首页 >问答首页 >Linux命令行regex处理工具,便于多行操作?

Linux命令行regex处理工具,便于多行操作?
EN

Stack Overflow用户
提问于 2015-07-29 01:58:47
回答 1查看 276关注 0票数 1

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

使用Perl在命令行处理正则表达式,如果使用"slurp模式“,则相对容易。我可以用这样的台词

代码语言:javascript
代码运行次数:0
复制
perl -0777 -pe 's/pattern/replace-text/' foo.txt

“模式”可以有我需要的多少\n。

对于Linux命令行,可以使用包含(\r)\n的regexes的选项有哪些?对我来说,文本跨行中的匹配模式特别重要。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-30 04:12:15

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

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

代码语言:javascript
代码运行次数:0
复制
$ 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

现在,一个匹配换行符的正则表达式,如您的示例中所示:

代码语言:javascript
代码运行次数:0
复制
$ pcregrep -M 'foo\nbar' malt
this is foo
bar baz

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

代码语言:javascript
代码运行次数:0
复制
$ 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)模式修饰符来完成,例如:

代码语言:javascript
代码运行次数:0
复制
$ 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“开始:一直到文件上的最后一条。与“懒惰”消费的工作方式相比,这种差异是显著的--我们可以使用?量化行为修饰符这样做:

代码语言:javascript
代码运行次数:0
复制
$ 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

后者与前者的表达方式相同,只是与“?”懒惰行为修饰语

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31690021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档