【问题标题】:JQ: how to delete object from array based on regex filter?JQ:如何根据正则表达式过滤器从数组中删除对象?
【发布时间】:2016-10-04 23:00:44
【问题描述】:

我有以下 JSON 数组(简化示例):

[  {
    "op": "remove",
    "path": "/cache"
  },
  {
    "op": "add",
    "path": "/game_config"
  },
  {
    "op": "remove",
    "path": "/use_replication"
  },
  {
    "op": "add",
    "path": "/copy_replication"
  }
]

我想从数组中删除包含“复制”的对象。结果是:

[  {
    "op": "remove",
    "path": "/cache"
  },
  {
    "op": "add",
    "path": "/game_config"
  }
]

我找到了一种只获取它们的方法:

 .[] | select( .path | contains("replication"))

但是我找不到从数组中只删除它们而保留所有其他对象的方法。

【问题讨论】:

    标签: json regex jq


    【解决方案1】:

    可以使用not 实现否定。在您的情况下,由于您提到使用正则表达式,您可以使用test/1,如下所示:

    map( select(.path | test("replication") | not))
    

    【讨论】:

    • 是 |管道还是布尔或?
    【解决方案2】:

    我找到了另一种方法(我在接受的答案中遗漏了“不”):

     .[] | (select( .path | contains("value") | not ))
    

    【讨论】:

    • contains 不是正则表达式过滤器。您还要求一种从数组中删除项目的技术,但是 .[] 流式传输它们。当然[.[] | ...] 等价于map(...)(根据map 的定义)。
    • 也许我没有正确表达自己。删除或过滤掉它们都没有关系,只要最终结果不显示过滤掉的对象即可。
    • 我不知道“包含”不是正则表达式。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2021-02-16
    • 1970-01-01
    • 2019-09-21
    相关资源
    最近更新 更多