我只是想在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
我的替代工作在过去,当没有涉及到断行。
有人知道是什么导致了这个问题吗?谢谢
1条答案
按热度按时间2ul0zpep1#
您的问题不在于 * 换行符 ,而在于*
replace
运算符是基于regex的**。因此,您的搜索模式
"UNION select hash(0)"
实际上只匹配UNION select hash0
(请注意,没有(
和)
),因此与预期的行不匹配,因此根本不会发生替换。原因是正则表达式中的
(...)
是一个 * 捕获组 * -(
和)
* 没有 * 按字面处理-您必须转义 * 它们,即\(
和\)
:注意
$&
的使用(转义为$&`以防止 *PowerShell* 对其进行解释),它引用正则表达式捕获的内容(matched),避免重复文字的需要。您可以在取代中使用常值文字,但请注意,任何 *literal* `$`字符都必须逸出为`$$`(或者,在`"..."`字符串内,作为
$$
);请参阅this answer,以了解支持哪些$
前缀占位符。您也可以使用
[regex]::Escape()
,以程序设计方式对整个字串执行 * 逸出 *:也就是说,正如Santigo Squarzon所指出的,您可以使用
[string]
类型的**.Replace()
.NET * 方法***,该方法(仅)执行 literal 替换,但有两个注意事项:-replace
不同,.Replace()
* 区分大小写 *,在 Windows PowerShell 中 * 总是 *,在 PowerShell(Core)7+ 中 * 默认 *。$&
与-replace
一起使用),替换字符串也是一个文字。有关何时使用
-replace
与.Replace()
的一般指导,请参见this answer的底部**