簡體   English   中英

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

[英]How to replace multiple lines from a text file using Powershell -replace

我正在編寫一個腳本來更改配置文件中的內存值。 我想在此文件中搜索一組特定的行,我嘗試使用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個空格。

如果要使用-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":之后還有一個額外的空格"maximumMemory":我刪除了。

我按原樣留下你的替換字符串,這會產生間距問題。 你會注意到額外的兩個空間縮進。 您可能不想在替換中使用制表符或修復其他行以與制表符對齊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM