替换字符串中存在特殊的 PowerShell 变量 $_ 会导致奇怪的行为;我想知道我是否遗漏了有关转义的某些内容,或者这只是一个缺陷。
此代码的输出...
$text = "WORD1 WORD2 WORD3 WORD4"
$newText = 'new $_ text'
$newText
$text -replace "WORD3",$newText
...是这样的,其中 $_ 由于某种原因与 $text 的原始内容插值期间替换操作:
new $_ text
WORD1 WORD2 new WORD1 WORD2 WORD3 WORD4 text WORD4
代替应该将其第二个参数视为文字 - 不使用插值 - 这对于大多数事物都是正确的,包括看起来像常规变量的东西,如下所示:
$foo = "HELLO"
$text = "WORD1 WORD2 WORD3 WORD4"
$newText = 'new $foo text'
$newText
$text -replace "WORD3",$newText
...其输出为:
new $foo text
WORD1 WORD2 new $foo text WORD4
但是 $_ 的存在会导致插值。$$ 也存在类似的问题。据我所知,没有其他特殊变量会导致插值。
请注意,这样的内联代码也会出现同样的问题:
$text -replace "WORD3",'new $_ text'
我在上面将其拆分出来只是为了表明在替换操作之前替换字符串是正确的。奇怪的是,如果我在这里将单引号替换为双引号,问对于插值,结果是不同的。即以下代码:
$text -replace "WORD3","new $_ text"
产生预期
WORD1 WORD2 new text WORD4
并不令人困惑
WORD1 WORD2 new $foo text WORD4
答案1
我能够使用
$text.replace('WORD3','new $_ text')
这给出了预期的输出
WORD1 WORD2 new $_ text WORD4
答案2
您现在可能已经知道,这是正则表达式引擎对捕获组的语法有冲突。这不是 PowerShell 字符串插值。您可以使用$$
$text = "WORD1 WORD2 WORD3 WORD4"
$newText = 'new $$_ text'
$newText
$text -replace "WORD3", $newText
"WORD1 WORD2 new $_ text WORD4"