Powershell 替换使用正则表达式匹配以一串括号开头的行

Powershell replace using regex to match a row starting with a string of brackets

我正在尝试创建一个 powershell 脚本来修改文件并用逗号替换以“][”开头的行。

我有一个文件 text.json,其中有些损坏 JSON,如下所示:

[
  {
    "Id": "5413146",
    "Datasets": [
      {
        "DatasetId": "354843154864",
        "DatasetName": "testset"
      }
    ],
    "SharingAction": "Direct"
  }
][][][][][
  {
    "Id": "656156462",
    "LastRefreshTime": "may"
  }
][][
  {
    "Id": "32448542",
    "LastRefreshTime": "jan"
  }
]

要修复它,我需要用逗号替换带有多个括号的行,我需要使用强大的 shell 脚本来完成。

我发现我可以将文件的内容读取到这样的变量中:

$text = Get-Content text.json -Raw

然后我可以替换普通文本并将修改后的内容输出到一个新文件,如下所示:

$text -replace 'may','june' | Out-File -FilePath text_modified.json

但是,我在使用正则表达式将行与括号匹配时遇到问题。

我发现匹配以“][”开头的行的正则表达式是这样的:

^]\[.*

我用两个不同的在线正则表达式验证器进行了测试,它似乎工作正常。那么我相信我正在寻找的命令应该是:

$text -replace '^]\[.*',',' | Out-File -FilePath text_modified.json

它不会取代任何东西。似乎它没有正确匹配括号。

$text -match ']' returns 是的,但是当我尝试 $text -match '^]' 时 returns 是错的。我也试过 '^\]' 也 returns False.

有什么想法吗?感谢您的帮助。

Get-Content returns 的 -Raw 参数是单个字符串,而不是表示文件中每一行的字符串数组。您当前的表达式实际上是在查找输入开头的模式,或者在本例中,文件开头.

如果删除 -Raw-replace 将改为对文件的每一行进行操作,并且每一行都将被处理 作为其自己的输入 。这意味着现在您在输入开头查找 ^]\[.* 的模式现在将在正确的行上匹配。

当然,Out-File 会将您更改的文件内容写入磁盘。


如果您真的想使用 -Raw,如评论中所述,您可以在模式前加上
(?m)。这是 多行模式 的 .NET 正则表达式修饰符。基本上,这个修饰符使 ^$ 匹配 line 的开始和结束,而不仅仅是 input[= 的开始和结束35=].