为什么行终止符`\r\n` 导致组不匹配?

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)

第一行没有任何内容被捕获,但所有(三)行都匹配。

为什么会这样?

cho*_*oba 6

使用cat -vxxd查看输出真正包含的内容。

$ 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在它的输出中添加一个换行符,所以最后一行是空的,但它仍然匹配.*.