在PowerShell中删除与正则表达式匹配的JSON对象属性

时间:2019-07-10 17:35:03

标签: json powershell

给出一个示例json对象,例如:

{
  "Id": 1,
  "Name": "Pablo",
  "UnwantedProperty1XOXO": true,
  "UnwantedProperty2XOXO": false,
  ...
}

我想删除所有以XOXO结尾的属性(因此正则表达式类似于/.+XOXO$)。

如何使用PowerShell删除名称与正则表达式匹配的所有属性?(使用JSON对象或PowerShell对象)

我可以像这样从PowerShell对象中删除属性,但它似乎不适用于正则表达式: $myObject.PSObject.Properties.Remove("someProperty")

2 个答案:

答案 0 :(得分:2)

最健壮的解决方案是 not 而不是使用基于正则表达式的文本解析,这是 britttle (可能会传播属性值对跨多行,可能会意外地与属性 name 匹配以排除)。

相反:

  • 使用ConvertFrom-Json对自定义对象([pscustomobject]实例)执行正确的JSON解析 ...
  • ...,然后使用带有{em>通配符模式的Select-Object -Exclude 排除不感兴趣的属性 ...

  • ...,并根据需要使用ConvertTo-Json转换回JSON。

Get-Content -Raw file.json |
  ConvertFrom-Json |
    Select-Object * -ExcludeProperty *XOXO |
      ConvertTo-Json

注意:仅在 Windows PowerShell 中需要传递给[-Property] *的{​​{1}}参数;仅指定Select-Object时,PowerShell Core 明智地假定 -Property *

答案 1 :(得分:1)

您可以使用long_string.match(/\S.+?(?=( THS&)|$)/g) 导入文件的内容,然后使用内置的正则表达式运算符来执行此操作。

Get-Content

我们想将$data = Get-Content C:\Users\U394282\Desktop\test.json 设置为一个数组(在本示例中,它使用@()符号来封装结果,因此它始终具有$unwantedProps属性

.Count

根据JSON文件的结构以及由此删除的索引位置,您可能还希望有一个辅助函数,该函数将检查最后一项是否有逗号,从而使JSON无效: