powershell - 换行符在 powershell 中不起作用,同时替换

标签 powershell replace newline

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

相关文章:

file - 如何使用powershell检查文件夹中是否存在特定的文件扩展名?

powershell - Azure 资源管理器 powershell cmdlet 在 azure 门户测试 Pane (自动化帐户)上无法识别

Javascript 替换标签内的字符串

PHP:试图让 fgets() 在 CRLF、CR 和 LF 上触发

c - 在 C 中\n 是多字符吗?

powershell - 使域内的所有用户成为安全组的成员

powershell - 调用远程 powershell 命令未返回所有结果

javascript - 从任何给定字符串中删除任何给定字符

MySQL:如何替换字段中除最后 4 个字符之外的所有字符? (以保护信用卡#'s)

android - 在 Android 中使用换行符从浏览器复制文本