![](/img/trans.png)
[英]How do I match use regex to match multi-line text with specific starting and ending patterns
[英]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
特殊值
-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.