Как заменить несколько строк из текстового файла с помощью Powershell -replace - PullRequest
0 голосов
/ 17 мая 2019

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

Он отлично работает для замены одной строки, но попытка сопоставить несколько строк не приводит кРезультаты.Сценарий выглядит следующим образом:

Ниже приведен раздел конфигурации, который я пытаюсь проанализировать:

    {
      "taskType": "BuildDynamicMPLSCloud",
      "version": 1,
      "subTasks": [],
      "execName": "BuildDynamicMPLSCloud",
      "execCategory": 1
      "maximumMemory": 4294967296
    },
    {
      "taskType": "BuildDynamicMap",
      "version": 1,
      "subTasks": [],
      "execName": "BuildDynamicMap",
      "execCategory": 1,
      "maximumMemory": 4294967296
    },

Проверка одной строки для поиска и замены работ:

$NewContent=Get-Content "C:\Program Files\NetBrain\Worker Server\conf\rmworker.json"  | ForEach-Object { $_-replace """maximumMemory"": 4294967296", """execName"": ""BuildDynamicMap"",`r`n`t  ""execCategory"": 1,`r`n`t  ""maximumMemory"":  8589934592" }

Set-Content -Path "C:\Program Files\NetBrain\Worker Server\conf\rmworker.json" -Value $NewContent

Вывод кода из приведенного выше приведен ниже:

  {
      "taskType": "BuildDynamicMPLSCloud",
      "version": 1,
      "subTasks": [],
      "execName": "BuildDynamicMPLSCloud",
      "execCategory": 1
      "execName": "BuildDynamicMap",
      "execCategory": 1,
      "maximumMemory": 8589934592
    },
    {
      "taskType": "BuildDynamicMap",
      "version": 1,
      "subTasks": [],
      "execName": "BuildDynamicMap",
      "execCategory": 1,
      "execName": "BuildDynamicMap",
      "execCategory": 1,
      "maximumMemory": 8589934592
    },

Но при попытке сопоставить несколько строк для одного и того же сценария замены не удается:

$NewContent=Get-Content "C:\Program Files\NetBrain\Worker Server\conf\rmworker.json"  | ForEach-Object { $_-replace """execName"": ""BuildDynamicMap"",`r`n`t  ""execCategory"": 1,`r`n`t  ""maximumMemory"":  4294967296" , """execName"": ""BuildDynamicMap"",`r`n`t  ""execCategory"": 1,`r`n`t  ""maximumMemory"":  8589934592" }


Set-Content -Path "C:\Program Files\NetBrain\Worker Server\conf\rmworker.json" -Value $NewContent

В началекаждой новой строки есть 1 вкладка и 2 пробела в файле конфигурации.

1 Ответ

0 голосов
/ 17 мая 2019

Если вы хотите использовать -Replace, будет работать следующее:

$NewContent = (Get-Content "C:\Program Files\NetBrain\Worker Server\conf\rmworker.json" -Raw) -replace "(?ms)""execName"": ""BuildDynamicMap"",.*?""execCategory"": 1,.*?""maximumMemory"": 4294967296" , """execName"": ""BuildDynamicMap"",`r`n`t""execCategory"": 1,`r`n`t""maximumMemory"": 8589934592"

Я использовал переключатель -Raw, чтобы вернуть содержимое файла в виде одной строки.Это устраняет необходимость обрабатывать каждую строку индивидуально командой Foreach-Object.В части замены регулярных выражений я удалил элементы перевода строки и табуляции в пользу .*?.Я использовал однострочные и многострочные модификаторы (?sm), потому что строка состоит из нескольких строк, и я хочу, чтобы символ регулярного выражения . совпадал с символами новой строки.У вашей строки регулярного выражения также был дополнительный пробел после "maximumMemory":, который я удалил.

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

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