我想使用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>
答案 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产生歧义。