我只是想在 UNION 之前添加换行符,我已经尝试了以下两个命令。 所有修改文件(日期更新)但它不添加新行。
(Get-Content \\C\ELL.sql) -replace "UNION select hash(0)","`r`nUNION select hash(0)" | Set-Content \\C\ELL.sql
(Get-Content \\C\ELL.sql) -replace 'UNION select hash(0)','`r`nUNION select hash(0)' | Set-Content \\C\ELL.sql
我的替换过去有效,当时不涉及换行。
有人知道是什么原因造成的吗? 谢谢
最佳答案
您的问题不在于换行,而是由于 replace
运算符是regex基于。
因此,您的搜索模式 "UNION select hash(0)"
实际上仅匹配 UNION select hash0
(请注意缺少 (
和 )
),因此与预期的行不匹配,因此根本不会发生替换。
原因是正则表达式中的 (...)
是一个捕获组 - (
和 )
不被视为字面上 - 你必须逃避它们,即\(
和 \)
:
(Get-Content \\C\ELL.sql) -replace "UNION select hash\(0\)", "`r`n`$&" |
Set-Content \\C\ELL.sql
请注意替换操作数中 $&
的使用(转义为 `$&
以防止 PowerShell 解释它),它引用到正则表达式捕获(匹配)的内容,从而无需重复文本。您可以在替换中随意使用文字文本,但请注意,任何文字 $
字符都必须转义为 $$
(或者,在一个 "..."
字符串,如 `$`$
);请参阅this answer了解支持 $
前缀的占位符的摘要。
您也可以使用 [regex]::Escape()
以编程方式对整个字符串执行转义 :
(Get-Content \\C\ELL.sql) -replace ([regex]::Escape("UNION select hash(0)"), "`r`n`$&" |
Set-Content \\C\ELL.sql
也就是说,如 Santigo Squarzon指出,您可以使用 [string]
类型的 .Replace()
.NET方法,它(仅)执行字面替换,但有两个注意事项:
与
-replace
不同,.Replace()
区分大小写,始终 < em>Windows PowerShell 和 PowerShell (Core) 7+ 中的默认。您无法方便地引用替换字符串中匹配的内容(部分)(例如与
-replace
一起使用的$&
),这也是一个文字。
参见 this answer 的底部部分有关何时使用 -replace
与 .Replace()
关于powershell - 换行符在 powershell 中不起作用,同时替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74392340/