换行不工作powershell,当替换

amrnrhlw  于 2022-11-29  发布在  Shell
关注(0)|答案(1)|浏览(116)

我只是想在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

我的替代工作在过去,当没有涉及到断行。
有人知道是什么导致了这个问题吗?谢谢

2ul0zpep

2ul0zpep1#

您的问题不在于 * 换行符 ,而在于*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* 对其进行解释),它引用正则表达式捕获的内容(matched),避免重复文字的需要。您可以在取代中使用常值文字,但请注意,任何 *literal* `$`字符都必须逸出为`$$`(或者,在`"..."`字符串内,作为$$);请参阅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 * 方法***,该方法(仅)执行 literal 替换,但有两个注意事项:

  • -replace不同,.Replace() * 区分大小写 *,在 Windows PowerShell 中 * 总是 *,在 PowerShell(Core)7+ 中 * 默认 *。
  • 您无法方便地引用替换字符串中匹配的内容(的一部分)(例如$&-replace一起使用),替换字符串也是一个文字。

有关何时使用-replace.Replace()的一般指导,请参见this answer的底部**

相关问题