Mar*_*cus 3 perl line-endings capturing-group
我正在\r\n使用 Perl v5.30 在 Linux上处理带有 Windows 行终止符 ( ) 的文本文件。
我不明白的是,为什么使用这些文本文件,捕获组与字符不匹配,而正则表达式匹配。
例子:
$ echo $'Line1\r\nLine2\n' | perl -ne 'print /(.*)/'
Line2
$ echo $'Line1\r\nLine2\n' | perl -ne '/(.*)/ && print "match\n"'
match
match
match
Run Code Online (Sandbox Code Playgroud)
第一行没有任何内容被捕获,但所有(三)行都匹配。
为什么会这样?
使用cat -v或xxd查看输出真正包含的内容。
$ echo $'Line1\r\nLine2\n' | perl -ne 'print /(.*)/' | cat -v
Line1^MLine2
Run Code Online (Sandbox Code Playgroud)
^M对应于\r,它将光标移回行首,因此第二个匹配会覆盖第一个匹配。
这解释了两场比赛,但第三场在哪里?添加一些东西来分隔匹配:
$ echo $'Line1\r\nLine2\n' | perl -ne 'print /(.*)/, "|"' | cat -v
Line1^M|Line2||
Run Code Online (Sandbox Code Playgroud)
echo在它的输出中添加一个换行符,所以最后一行是空的,但它仍然匹配.*.