如何使用 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
开关将文件内容 return 作为一个字符串。这消除了使用 Foreach-Object
命令单独处理每一行的需要。在替换的正则表达式部分,我删除了换行符和制表符项以支持 .*?
。我使用了单行和多行修饰符 (?sm
),因为字符串是多行,我希望 .
正则表达式字符匹配换行符。您的正则表达式字符串在我删除的 "maximumMemory":
之后还有一个额外的 space。
我保留了您的替换字符串,这会导致间距问题。您会注意到额外的两个 space 缩进。您可能不想在替换中使用制表符或修复其他行以与制表符对齐。
我正在编写一个脚本来更改配置文件中的内存值。我想在此文件中搜索一组特定的行,我尝试使用 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
开关将文件内容 return 作为一个字符串。这消除了使用 Foreach-Object
命令单独处理每一行的需要。在替换的正则表达式部分,我删除了换行符和制表符项以支持 .*?
。我使用了单行和多行修饰符 (?sm
),因为字符串是多行,我希望 .
正则表达式字符匹配换行符。您的正则表达式字符串在我删除的 "maximumMemory":
之后还有一个额外的 space。
我保留了您的替换字符串,这会导致间距问题。您会注意到额外的两个 space 缩进。您可能不想在替换中使用制表符或修复其他行以与制表符对齐。