Perl不匹配多行

问题描述 投票:0回答:1

我想匹配。

Start Here Some example
text covering a few
lines. End Here

那我就配了

$ perl -nle 'print $1 if /(Start Here.*?)End Here/s'

然后粘贴上面的文字和 ctr-D. 它不符合cmd - 但在文件脚本中却符合。为什么?

shell perl
1个回答
2
投票

正如其他人所解释的那样,你一次只读一行文件,所以在多行上进行匹配是不会成功的。

一次读取一行文件通常是最好的方法。所以我们可以使用 "flip-flip "操作符来实现这个目的。

 $ perl -nle 'print if /Start Here/ .. /End Here/' your_file_here

3
投票

改变输入记录的分隔符 ($/)为空,使用 -0 命令行开关。

perl -0777nle 'print $1 if /(Start Here.*?)End Here/s' <<END
Start Here Some example
text covering a few
lines. End Here
THE_END

man perlrun

-0[octalhexadecimal] 指定输入记录分隔符 ($) 为八进制或十六进制数字。[...] 任何 0400 或以上的值都会导致 Perl 读取整个文件,但按照惯例,通常用于此目的的值是 0777。

man perlvar

IO::Handle->input_record_separator( EXPR ) $INPUT_RECORD_SEPARATOR $RS $ 输入记录的分隔符,默认为新行。 这影响了Perl对 "行 "的理解。[...] 你可以把它设置为[...]"undef "来读取文件的结尾。

© www.soinside.com 2019 - 2024. All rights reserved.