我正在阅读一本类轮书并遇到了
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/