gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:19:23 25 4
gpt4 key购买 nike

我正在编写一个脚本,用于更改配置文件中的内存值。我想在此文件中搜索一组特定的行,并尝试使用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),因为字符串是多行,并且我希望 . regex字符与新行字符匹配。我删除的 "maximumMemory":后,您的正则表达式字符串也有一个多余的空格。

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

关于powershell - 如何使用Powershell -replace替换文本文件中的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56191136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com