在powershell替换中可能存在错误,或者我做错了什么?

时间:2012-06-28 23:32:05

标签: regex powershell backreference

我正在对某些数据进行正则表达式,如果$ _在“替换”部分,我也会得到内容。我已经为$ replace尝试了各种各样的东西,但似乎无法阻止这种行为。我也试过[regex] :: escape()但是最终做同样的事情,只是使用转义字符。

我需要能够在替换中容忍$ _。我可以把它变成别的东西然后做一个修复,但那很难看,我宁愿避免它。

最后,如果$ replace ='$ anythingelse'看起来按预期运行,只有$ _似乎会导致此问题。如果可以禁用所有可以解析的解析。

剧本:

 $contents = 'foo'
 $replace = '$_ bar'
 $final = $contents -replace 'oo', $replace
 Write-Output "Contents: $contents"
 Write-Output "Replace: $replace"
 Write-Output "Final: $final"

输出:

 Contents: foo
 Replace: $_ bar
 Final: ffoo bar

系统:Windows 7,PSH 2,64位

我做错了什么或这真的是一个错误?

编辑6/29:

我做了替换,所以我可以做替换。这很愚蠢,应该有一种方法来禁用解析(这会使它运行得稍快)。

 $contents = 'foo'
 $replace = '$_ bar'
 **$rep = $replace -replace '\$','$$$'**
 $final = $contents -replace 'oo', $rep
 Write-Output "Contents: $contents"
 Write-Output "Replace: $replace"
 Write-Output "Final: $final"

输出

 Contents: foo
 Replace: $_ bar
 Final: f$_ bar

1 个答案:

答案 0 :(得分:4)

您的问题是替换字符串中的“$ _”表示整个输入字符串。如果你想要一个文字美元符号,你需要使用$$:

来转义它
$replace = '$$_ bar'

有关详细信息,请参阅msdn上的substitutions页面。

编辑以解决问题编辑29/6

如果您只想要一个没有任何正则表达式的基本字符串替换,只需使用标准字符串替换而不是-replace

$final = $contents.replace('oo', $replace)