繁体   English   中英

如何将命令行中的多行模式与 perl 样式的正则表达式匹配?

[英]How can I match multi-line patterns in the command line with perl-style regex?

我经常使用正则表达式来转换文本。

要从命令行转换巨大的文本文件,perl 让我这样做:

perl -pe < in.txt > out.txt

但这本质上是逐行的。 有时,我想匹配多行的东西。

如何在命令行中执行此操作?

要 slurp 文件而不是逐行处理,请使用-0777开关:

perl -0777 -pe 's/.../.../g' in.txt > out.txt

perlrun #Command Switches

特殊值-00将导致 Perl 在段落模式下吞咽文件。 任何-0400或更高的值都会导致 Perl -0777整个文件,但按照惯例,值-0777是通常用于此目的的值。

显然,对于大文件,这可能效果不佳,在这种情况下,您需要编写某种类型的缓冲区来执行此替换。 尽管没有关于您意图的真实信息,我们也无法提供更好的建议。

Grepping 跨行边界

所以你想跨行边界grep...

您很可能已经安装了pcregrep 如您所知,PCRE 代表Perl-Compatible Regular Expressions ,该库绝对是 Perl 风格的,尽管与 Perl 不同。

要跨多行匹配,您必须打开多行模式-M ,这与(?m)

运行pcregrep -M "(?s)^b.*\\d+" text.txt

在这个文本文件上:

a
b
c11

输出将是

b
c11

而 grep 会返回空。

摘自文档:

-M, --multiline 允许模式匹配多于一行。 当给出这个选项时,模式可能有用地包含文字换行符和 ^ 和 $ 字符的内部出现。 成功匹配的输出可能包含多行,最后一行是匹配结束的那一行。 如果匹配的字符串以换行序列结尾,则输出在该行的末尾结束。

设置此选项后,将在“多行”模式下调用 PCRE 库。 可以匹配的行数是有限制的,这是由 pcregrep 在扫描输入文件时缓冲输入文件的方式所强加的。 但是,pcregrep 确保至少有 8K 个字符或文档的其余部分(以较短者为准)可用于前向匹配,类似地,前面的 8K 个字符(或所有前面的字符,如果少于 8K)保证可用于后视断言。 当逐行读取输入时,此选项不起作用(请参阅 --line-buffered。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM