Использование Powershell для замены захваченного значения

Я хочу заменить значение в 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>
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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. Обратите внимание, что обратные кавычки перед $ необходимы для того, чтобы Powershell обрабатывал их как буквальные $ символы, а не строку, экстраполирующую " маркер».

Вам нужно ${1}, а не $1, потому что переменная $test начинается с цифры, а когда цифра идет сразу после обратной ссылки (например, $1), идентификатор должен быть заключен в фигурные скобки, чтобы избежать двусмысленности с идентификатором группы.

Другие вопросы по теме