【问题标题】:jq - get dict element based on key regexjq - 根据关键正则表达式获取字典元素
【发布时间】:2023-02-03 19:16:12
【问题描述】:

我正在使用具有以下结构的 JSON 对象:

{
  "key-foo-1.0": [
    {
      "key1": "foo",
      "key2": "bar",
      "id": "01"
    },
    {
      "key1": "foo",
      "key2": "bar",
      "id": "23"
    }
  ],
  "key-bar-1.0": [
    {
      "key1": "foo",
      "key2": "bar",
      "id": "45"
    },
    {
      "key1": "foo",
      "key2": "bar",
      "id": "67"
    }
  ],
  "key-baz-1.0": [
    {
      "key1": "foo",
      "key2": "bar",
      "id": "89"
    }
  ]
}

我想获取所有 id 值,其中“父”键名称与模式 .*foo.* 或 ` 匹配。酒吧。.

所以在我的例子中是这样的:

cat json | jq <some filter> 
01
23
45
67

基于https://unix.stackexchange.com/questions/443884/match-keys-with-regex-in-jq 我试过:

$ cat json | jq 'with_entries(if (.key|test(".*foo.*$")) then ( {key: .key, value: .value } ) else empty end )'
{
  "key-foo-1.0": [
    {
      "key1": "foo",
      "key2": "bar",
      "id": "01"
    },
    {
      "key1": "foo",
      "key2": "bar",
      "id": "23"
    }
  ]
}

但我真的不知道如何继续。

我还认为有更好/更简单的解决方案。

【问题讨论】:

    标签: json jq


    【解决方案1】:

    您可以使用以下 JQ 表达式:

    jq 'to_entries[] | select(.key | test(".*foo.*|.*bar.*")) | .value[] | .id'
    

    JQ playground example

    【讨论】:

      【解决方案2】:

      你可以选择:

      jq -r '.[keys_unsorted[] | select(test(".*foo.*|.bar.."))][].id'
      
      01
      23
      45
      67
      

      这将使用keys_unsorted 收集所有键,然后使用selects 那些与test 中的正则表达式匹配的键。包装 .[…] 下降到它们中,随后的 [] 迭代子项,并且 .id 使用 -r 标志将值作为原始文本输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-09
        • 2014-03-01
        • 1970-01-01
        相关资源
        最近更新 更多