Я хочу заменить значение в XML с помощью PowerShell. У меня ниже строка (часть 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>
Группы захвата используются в регулярном выражении для извлекать части сопоставления шаблона, когда нам нужно сопоставить их в определенных контекстах. Замена захваченных текстов напрямую не поддерживается, хотя с помощью некоторого кода это можно обойти.
Вместо этого используйте группы захвата, чтобы делать то, для чего они предназначены: захватывать то, что вам нужно сохранить, и просто сопоставлять то, что вам нужно заменить.
Использовать
$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
), идентификатор должен быть заключен в фигурные скобки, чтобы избежать двусмысленности с идентификатором группы.