如何使用Powershell -replace替换文本文件中的多行

时间:2019-05-17 17:37:16

标签: powershell control-characters

我正在编写一个脚本,用于更改配置文件中的内存值。我想在此文件中搜索一组特定的行,然后尝试使用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 :(得分:0)

如果您想使用-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)是因为字符串是多行,并且我希望. regex字符与新行字符匹配。在我删除的"maximumMemory":之后,您的正则表达式字符串也有多余的空格。

我保留了替换字符串的原样,这会引起间距问题。您会注意到多余的两个空格缩进。您可能不想在替换中使用tab或将其他行固定为与tab对齐。