PowerShell启用MultiLine选项时,多行替换匹配行尾失效问题
PowerShell -replace 多行替换失效的原因
核心问题:CRLF换行符与正则行尾匹配的冲突
PowerShell里用双引号@"..."@定义的多行字符串,默认换行符是CRLF(\r\n)。开启(?m)(MultiLine)模式后,正则中的$仅匹配**\n换行符的前一个位置**,不会把前面的\r(回车符)视为行尾的一部分。
你的正则(?m)^---$要求整行只能是---,但实际字符串里---后面跟着\r\n,相当于---末尾还有个隐藏的\r字符,导致$无法匹配到---的结尾,所以替换完全没生效。
两种快速修复方法
- 调整正则,允许行尾存在可选的
\r:
@" abc --- def "@ -replace '(?m)^---\r?$', 'AAA'
- 改用单引号的Here-String(
@'...'@),它会保留编辑器的原始换行符,若编辑器使用LF(\n)换行,就能直接匹配:
@' abc --- def '@ -replace '(?m)^---$', 'AAA'
验证方式
可以用以下代码查看字符串的字节细节,能清晰看到---后面的\r(ASCII码13)和\n(ASCII码10):
$str = @" abc --- def "@ [System.Text.Encoding]::ASCII.GetBytes($str)
内容的提问来源于stack exchange,提问作者Łukasz Nojek
相关产品推荐
相关产品推荐

