loo*_*oop 0 regex perl multiline
我试图在多行上匹配一个模式。我想确保我正在寻找的行以 \r\n 结尾,并且在某个时刻后面有特定的文本。我已经在 grep 中尝试过,但是如果没有某些版本没有的 -P 开关,它就无法工作。所以现在我正在尝试使用 perl。
我不明白为什么这不起作用:
echo -e -n "ab\r\ncd" | perl -w -e $'binmode STDIN;undef $/;$_ = <>;if(/ab\r\ncd/){print "test"}'
Run Code Online (Sandbox Code Playgroud)
我在全局 ( undef $/;) 中启用了 slurp 模式,这很草率但对此很好(我当然会采取任何更好的想法)。如果我只是执行 aprint并将其通过管道传输到od我可以看到 $_ 保存正确的字节。正则表达式应该匹配那些相同的字节,但由于某种原因不起作用。我可以匹配 ab\r 但不能匹配 ab\r\n 等。
如果您$从代码部分的开头删除杂散,您的代码就可以工作。
但是,可以通过使用一些命令行开关来收紧它,例如-0777:
echo -e -n "ab\r\ncd" | perl -0777 -ne 'print "test" if /ab\r\ncd/'
Run Code Online (Sandbox Code Playgroud)
输出:
test
Run Code Online (Sandbox Code Playgroud)
开关:
-0777:按照记录在整个文件中 perlrun-n:while(<>){...}为输入文件中的每一“行”创建一个循环。-e: 告诉perl在命令行上执行代码。