首页 > 解决方案 > 使用 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>

标签: regexpowershell

解决方案


当我们需要匹配特定上下文中的模式匹配时,正则表达式中使用捕获组来提取模式匹配的一部分。不直接支持替换捕获的文本,但可以通过一些编码来解决它。

相反,使用捕获组来做他们应该做的事情:捕获您需要保留的内容并匹配您需要替换的内容。

利用

$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 组的值。注意前面的反引号$是 Powershell 将它们视为文字$字符所必需的,而不是外推“标记”的字符串。

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


推荐阅读