【问题标题】:JQ: how can I remove keys based on regex?JQ:如何根据正则表达式删除键?
【发布时间】:2018-09-05 12:11:23
【问题描述】:

我想删除所有以“隐藏”开头的键。需要注意的是,键可能嵌套在许多级别。我想使用正则表达式查看答案,尽管我认识到在我的示例中一个简单的 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
  }]
}

谢谢!

【问题讨论】:

    标签: json jq


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我一直在尝试使用del.[-1] 语法对我来说是新的。甚至paths 的用例对我来说也是个谜。
    • 您能解释一下test/1test/2 之间的区别吗,在文档或教程中没有看到这些。
    • 所有正则表达式函数都有 1 个和 2 个参数变体。第二个通常用于设置其他标志(例如g 用于全局匹配或i 用于不区分大小写的匹配)。查看manual 了解所有可用功能。
    • 我在这里遇到了一个新的 JSON 输入问题(请参阅已编辑的问题)。问题是由truefalsenull 值以及在键h 中找到的数组引起的。有什么想法吗?
    • 这些值应该对这里的结果没有影响,因为我们是根据路径进行过滤的。但是,我们确实需要将路径限制为标量(而不仅仅是所有可能的路径)。没有它,数组值的路径也将被返回,并且索引0 不能作为字符串进行测试(没有转换)。由于我们专门针对属性名称进行测试,因此可以忽略它们。
    【解决方案2】:

    解决该问题的一种直接方法是将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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 2023-02-03
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      相关资源
      最近更新 更多