如何在 Powershell 中转义反斜杠

17

我正在编写一个PowerShell程序,用于替换字符串

-replace "$in", "$out"

如果字符串包含反斜杠,它将无法正常工作,我该如何进行转义处理?


你能给我们提供一些关于你的代码的详细信息吗?(为了转义反斜杠,你需要使用双反斜杠:"\"代替""。) - Milán Pintér
2个回答

22
< p > -replace 运算符使用正则表达式,其中反斜杠被视为特殊字符。您可以使用双反斜杠来获得一个字面上的单个反斜杠。

在您的情况下,由于您正在使用变量,我假设在设计时您不会知道其内容。在这种情况下,您应该通过[RegEx] :: Escape() 运行它:

-replace [RegEx]::Escape($in), "$out"

该方法会使用必要的内容将任何对于正则表达式而言具有特殊意义的字符进行转义,使其成为文本匹配(另外一些特殊字符包括.$^()[]等等)。


1
不错的工作,Brian,谢谢。 - Jaqueline Vanek
1
谢谢你的回答,Brian。 - Zakaria Belghiti
1
非常好。我忘记了 Regex.Escape。这是一个比我的更好的解决方案,因为PowerShell应该可以正确转义它。 - Bacon Bits
点号呢?(.) 这个也要转义。 - Dmitry Gusarov
@DmitryGusarov点已包含在我的非穷尽字符列表中,并且也通过推荐的方法进行了转义。 - briantist

11
您需要使用另一个反斜杠转义模式中的反斜杠,或者使用 .Replace() 方法替换 -replace 运算符(但请注意它们可能执行不同的操作):
PS C:\> 'asdf' -replace 'as', 'b'
bdf
PS C:\> 'a\sdf' -replace 'a\s', 'b'
a\sdf
PS C:\> 'a\sdf' -replace 'a\\s', 'b'
bdf
PS C:\> 'a\sdf' -replace ('a\s' -replace '\\','\\'), 'b'
bdf

请注意,只有搜索模式字符串需要转义。代码-replace '\\','\\'表示:“用未转义的文字串'\\'(两个反斜杠)替换已经被转义的模式字符串'\\'(单个反斜杠)。”因此,您可以使用以下代码:
-replace ("$in" -replace '\\','\\'), "$out"

[注意:briantist的解决方案更好。]

但是,如果您的模式具有连续的反斜杠,则需要进行测试。

或者,您可以使用.Replace()字符串方法,但正如我上面所说,它可能无法完全匹配-replace运算符的行为:

PS C:\> 'a\sdf'.replace('a\\s', 'b')
a\sdf
PS C:\> 'a\sdf'.replace( 'a\s', 'b')
bdf

谢谢您的回答,我还有一个问题,如果-replace的第二个参数也有反斜杠,那我应该通过添加另一个反斜杠来转义它,例如这个命令:PS C:> 'a\sdf' -replace 'a\s', 'b\s'它会输出'b\sdf'吗? - Zakaria Belghiti
3
第二个字符串是按字面意义来理解的。原因在于-replace的第一个参数被解释为正则表达式:'asdf' -replace '[ad]', '1234'返回结果为1234s1234f - Bacon Bits
1
@ZakariaBelghiti 没问题。不过,briantist 的解决方案使用 -replace ([RegEx]::Escape($in)), "$out" 比我的好。如果我记得这个函数,我本应该使用它。 - Bacon Bits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接