我正在阅读一本类轮书并遇到了

perl -pe 's/$/\n/' file

它通过将行尾设置为新行来在每行之后插入一个空行,从而在现有换行符中添加一个新行,从而产生一个空行。
由于这是模式末尾没有 g 的第一个示例,我尝试了
perl -pe 's/$/\n/g' file

这导致行之间有 2 个空行。
我原以为没有区别,因为每行只有一个 $,因此替换所有这些代码应该与替换第一个代码相同。
这里发生了什么?

最佳答案

/$/ 匹配“字符串结尾”。这可能是

  • 字符串的结尾(如 /\z/ ),
  • 或就在字符串结尾之前的换行符之前(如 /(?=\n\z)/ )。

  • (另外,/$/m 匹配“行尾”。这可能是
  • 字符串的结尾,
  • 或就在换行符之前(如 /(?=\n)/ )。

  • )。

    使用您的替换 /$/\n/g ,正则表达式匹配两次:一次在换行符之前,然后在字符串的末尾:
  • 第一个匹配项在换行符之前:
    "foo\n"
    #   ^ match
    

    在当前匹配结束之前放置一个换行符:
    "foo\n\n"
    #     ^ insert before
    
  • 下一个匹配在字符串的末尾:
    "foo\n\n"
    #       ^ match
    

    在当前匹配结束之前插入换行符:
     "foo\n\n\n"
     #         ^ insert before
    
  • 未找到更多匹配项。

  • 解决方案:如果 $ 为您提供 DWIMmy,请始终明确匹配 \z\n,可能与 (?=\n) 之类的前瞻一起使用。考虑匹配所有 Unicode 行分隔符 \R 而不仅仅是 \n

    关于regex - 为什么 `perl -pe ' s/$/\n/g'` 添加 2 个空行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48686028/

    10-10 02:59