[英]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.