为什么`perl -pe的/ $/\n/g'`添加2个空白行?

pee*_*eer 4 regex perl

我正在完成一本班轮书并且遇到了

perl -pe 's/$/\n/' file
Run Code Online (Sandbox Code Playgroud)

通过将行的结尾设置为新行,在每行之后插入一个空行,从而在现有换行符中添加一个新行,从而产生一个空行.因为这是第一个没有g模式结束的例子,我试过了

perl -pe 's/$/\n/g' file
Run Code Online (Sandbox Code Playgroud)

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

amo*_*mon 9

/$/匹配"字符串结束".这可能是

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

(另外,/$/m匹配"行尾".这可能是

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

).

通过替换/$/\n/g,正则表达式匹配两次:一次在换行符之前,然后再次在字符串结尾处:

解决方案:如果$是给你DWIMmy,总是匹配\z\n明确,可能与前瞻一样(?=\n).考虑匹配所有Unicode行分隔符\R而不仅仅是\n.

  • @Borodin好点,抱歉混乱.我已经纠正了"输入"→"字符串".但在将来,请假设一个诚实的错误而不是恶意("欺骗制造").当你发现问题时,你也有足够的代表自己进行编辑! (3认同)
  • 输入与`$`或`\ z`元字符无关,并且它具有欺骗性来构造像*end of input*这样的概念,它在任何地方都不存在. (2认同)