模式匹配字段名称与 jq

Pattern matching field names with jq

这是一个非常基本(可能很愚蠢)的问题,但我无法解决...

我有一个具有这种结构的 JSON 文件:

{
    "data": {
        "what a burger": [1,2,3],
        "wap": [66],
        "the map": [11,20],
        "H. Incandenza": [1,1],
        "What a burger": [a,a,3]
    }
}

我想提取 data 中 "name" 匹配特定模式的字段值。例如,我想提取 "what a burger" 所有不区分大小写的巧合以获得

[1,2,3],[a,a,3]

我猜是这样的

jq '.data | match("what a burger";"i")'

但这会导致

jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string

干杯。

您的语句不起作用,因为您尝试将数据对象提供给 match,但 match 只能对字符串起作用。

以下表达式将执行您想要的操作。 to_entries 将对象转换为键和值数组。然后,我们通过使用 mapselect 遍历此数组的所有条目,其中 .key(现在是一个字符串)具有 match。最后我们只打印出每个元素的值。

.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value)

不过,两点意见:

  • JSON 中不允许 [a,a,3],因为 a 不是数字。
  • 之所以有效,是因为键实际上是不同的,即使只是字母大小写不相等。如果至少有两个键相同,您将 运行 出问题,因为键应该是唯一的。事实上,jq只会输出其中一个元素。

这里有一个稍微简短的替代方法:

.data | with_entries(select(.key|match("what a burger";"i")))[]

纠正输入后,使用 jq 的 -c 选项,这将产生两行:

[1,2,3]
["a","a",3]