使用jq匹配字段名称的模式

时间:2017-02-05 11:37:49

标签: json regex key match 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]
    }
}

我想提取数据中“name”与某个模式匹配的字段值。例如,我想提取“什么汉堡”得到的所有不区分大小写的巧合

[1,2,3],[α,α,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

干杯。

2 个答案:

答案 0 :(得分:7)

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

以下表达式可以满足您的需求。 to_entries将对象转换为键和值数组。然后,我们使用mapselect遍历此数组,其中.key(现在是一个字符串)的所有条目都有match。最后,我们只打印出每个元素的值。

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

然而,有两条评论:

  • JSON中不允许使用[a,a,3],因为a不是数字。
  • 它起作用,因为键实际上是不同的,即使只有字母大小写不相等。如果至少有两个密钥相同,则会遇到问题,因为密钥应该是唯一的。实际上,jq只会输出其中一个元素。

答案 1 :(得分:7)

这是一个稍微简短的选择:

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

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

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