Найдите строку, содержащую «string_a», а затем замените соответствующий «string_b» - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть конфигурация json, которую я хочу sed в Powershell. Вот запись в config.json:

"gateway.public.host": "http://placeholder.ourdomain.com",

Я хочу найти строку, соответствующую строке gateway.public.host, но я хочу заменить слово placeholder в этой строке.

Большинство примеров, которые я нахожу на Powershell, - это найти совпадение и заменить его.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Заменить является эквивалентом SED. Поскольку вы новичок в Powershell, я бы выбрал первый метод.

Если ваш сценарий действительно специфичен:

$Json = Get-Content filename.json
$Json = $Json -replace ("`"gateway.public.host`": `"http://placeholder.ourdomain.com`"","`"gateway.public.host`": `"http://newvalue.ourdomain.com`"")

$Json | Set-Content filename.json -Force

Или вы можете сделать это в одну строку

(Get-Content filename.json).replace("`"gateway.public.host`": `"http://placeholder.ourdomain.com`"","`"gateway.public.host`": `"http://newvalue.ourdomain.com`"") | Set-Content filename.json

В Powershell cat - это псевдоним get-content, так что вы можете даже сделать это, если хотите «почувствовать» больше linux:

cat filename.json | %{$_ -replace "`"gateway.public.host`": `"http://placeholder.ourdomain.com`"","`"gateway.public.host`": `"http://newvalue.ourdomain.com`""} | Set-Content filename.json
1 голос
/ 08 ноября 2019

Подход регулярного выражения был бы здесь очевиден. Сопоставьте все от начала строки до и включая «заполнитель» с группой захвата, заменяющей текст после группы захвата, оставляя оставшуюся строку без изменений.

(Get-Content $file) -replace "(.*gateway.public.host.*)placeholder", '$1ReplacementText'

Хост других регулярных выражений будет работать здесь какхорошо.


Однако мы также можем использовать power в PowerShell с командлетами ConvertFrom-Json и ConvertTo-Json

$json = '{
    "gateway.public.host": "http://placeholder.ourdomain.com"
}'

$jsonObject = $json | ConvertFrom-Json
$jsonObject."gateway.public.host" = $jsonObject."gateway.public.host" -replace "placeholder", "holdplacer"
$jsonObject | ConvertTo-Json -Depth 5

, которые дадут вам

{
    "gateway.public.host":  "http://holdplacer.ourdomain.com"
}

Да, я признаю, что там больше кода. В зависимости от того, с чего вы начинаете, и где вы хотите закончить, ваш код будет чище с помощью этого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...