JQ:如何删除基于正则表达式的密钥?

时间:2018-09-05 12:11:23

标签: json jq

我想删除所有以“ hide”开头的键。重要的是要注意,键可能嵌套在许多级别。我想使用正则表达式来查看答案,尽管我知道在我的示例中,一个简单的contains就足够了。 (我也不知道如何使用contains来做到这一点,顺便说一句。)

输入JSON 1:

{
  "a": 1,
  "b": 2,
  "hideA": 3,
  "c": {
    "d": 4,
    "hide4": 5
  }
}

所需的输出JSON:

{
  "a": 1,
  "b": 2,
  "c": {
    "d": 4
  }
}

输入JSON 2:

{
  "a": 1,
  "b": 2,
  "hideA": 3,
  "c": {
    "d": 4,
    "hide4": 5
  },
  "e": null,
  "f": "hiya",
  "g": false,
  "h": [{
    "i": 343.232,
    "hide9": "private",
    "so_smart": true
  }]
}

谢谢!

2 个答案:

答案 0 :(得分:3)

由于您只是检查键的开始,因此在这种情况下,可以使用startswith/1,否则可以使用test/1test/2。然后,您可以将要删除的路径传递给delpaths/1

您可能希望事先按字符串过滤键(或转换为字符串)以说明树中的数组。

delpaths([paths | select(.[-1] | strings | startswith("hide"))])
delpaths([paths | select(.[-1] | strings | test("^hide"; "i"))])

答案 1 :(得分:1)

解决问题的一种直接方法是将walkwith_entries结合使用,例如

walk(if type == "object" 
     then with_entries(select(.key | test("^hide") | not))
     else . end)

如果您的jq没有walk/1,则只需在调用它之前包含其def(例如从https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq中获得)即可。

相关问题