使用Powershell替换捕获的值

时间:2019-05-29 17:22:47

标签: regex powershell

我想使用PowerShell替换XML中的值。我下面的字符串(XML的一部分)想用不同的值替换100

<stringProp 79357name="ThreadGroup.79357num_threads">100</stringProp>

我尝试了下面的代码,这些代码标识了所需的值,但是在替换所需的值时,替换了所有数值

$DN = '<stringProp 79357name="ThreadGroup.79357num_threads">100</stringProp>'
$test =10000
[regex]$rx='^ThreadGroup.79357num_threads">(.+?)</stringProp>$'
$rx.Match($DN)
$DN = $rx.Replace($DN,'$1') -replace '\d+',$test
Write-Host $DN

运行上述代码后,我的输出低于输出

<stringProp 10000name="ThreadGroup.10000num_threads">10000</stringProp>

并且期待着

<stringProp name="ThreadGroup.10000num_threads">10000</stringProp>

1 个答案:

答案 0 :(得分:1)

当需要在特定上下文中匹配捕获组时,在正则表达式中使用

捕获组提取。不直接支持替换捕获的文本,尽管可以进行一些编码。

相反,使用捕获组来执行它们的工作意图:捕获需要保留的内容,并与需要替换的内容进行匹配。

使用

$DN -replace '(ThreadGroup\.79357num_threads">).*?(</stringProp>)',"`${1}$test`$2"

ThreadGroup.79357num_threads">(ThreadGroup\.79357num_threads">)捕获到组1,</stringProp>(</stringProp>)捕获到组2。

"`${1}$test`$2"的替换内容是组1($1)的内容,然后是$test变量的值,然后是组2的值。请注意{{1 }}是Powershell将它们视为文字$字符而不是字符串外推“标记”的必要条件。

您需要$而不是${1},因为$1变量以数字开头,并且当反向引用后直接有一个数字(例如$test)时,ID应该用大括号括起来,以避免与组ID产生歧义。