问题 jq - 选择具有给定键名的对象


我有一个具有多个级别的任意结构,等等。我需要选择包含一个名为key的键的所有对象 updateDate。我怎么用jq做到这一点?我提出了一种方法,但是当它访问我必须要插入的叶子时,它也会在无效数据类型上产生错误:

jq 'recurse(.[]) | has("updateDate")' | grep -Fv error

我真的不明白如何检查类型或叶子,我怀疑有一种更简单的方法来实现我想要的东西?


1737
2018-04-24 12:10


起源



答案:


在1.4中你可以:

jq '..|.updateDate?'

如果你坚持使用1.3,你可以使用更长的程序,如下所示:

jq 'recurse(if type == "array" or type = "object" then .[] else empty end) | if type == "object" then .updateDate else empty end'

15
2018-06-19 06:44



当结构包含数组时,这将出错。添加 |objects| 我认为,在中间修复它。 - Tgr


答案:


在1.4中你可以:

jq '..|.updateDate?'

如果你坚持使用1.3,你可以使用更长的程序,如下所示:

jq 'recurse(if type == "array" or type = "object" then .[] else empty end) | if type == "object" then .updateDate else empty end'

15
2018-06-19 06:44



当结构包含数组时,这将出错。添加 |objects| 我认为,在中间修复它。 - Tgr


未经测试:如何 jq 'recurse(.[]?) | objects | has("updateDate")' ?


1
2018-06-19 06:44



recurse(。[]?)|对象|选择(有( “一”)) - Eric Hartford