JSON key-globbing

时间:2018-05-08 00:12:08

标签: json key glob jq

jq手册页上有一些输出格式的例子,特别是当你想要完全回显输入JSON中的内容时的一些快捷方式。

如果我想要完全回显输入中的内容,但仅针对匹配特定模式的键,该怎么办?

例如,给定输入如此......

[
{"Name":"Widgets","Size":10,"SymUS":"Widg","SymCN":"Zyin","SymJP":"Kono"},
{"Name":"Blodgets","Size":400,"SymUS":"Blodg","SymAU":"Blod","SymJP":"Kado"},
{"Name":"Fonzes","Size":11,"SymRU":"Fyet","SymBR":"Foao"}
]

假设我要选择Name以“ets”结尾的所有对象,然后显示Name以及Sym*形式的所有属性。我所知道的关于这些属性的每个JSON对象都有一个或多个,名称的格式为Sym,后跟两个字母的ISO国家代码。

我想这样做:

jq '.[] | select(.Name | endswith("ets")) | {Name, Sym*}'

但这不是一件事。

这不是jq设计为在单个操作中处理的东西吗?我是否应首先浏览文件以收集所有可能的密钥,然后通过slurpfile明确列出所有密钥?

1 个答案:

答案 0 :(得分:2)

解决问题的简单方法的关键是.[] | select(.Name | test("ets$")) | {Name} + (to_entries | map(select(.key|test("^Sym"))) | from_entries) ,如在线手册中所述。根据您的示例数据,以下过滤器根据我所理解的期望生成下面显示的输出:

{
  "Name": "Widgets",
  "SymUS": "Widg",
  "SymCN": "Zyin",
  "SymJP": "Kono"
}
{
  "Name": "Blodgets",
  "SymUS": "Blodg",
  "SymAU": "Blod",
  "SymJP": "Kado"
}

您可能希望优化正则表达式测试,和/或进行其他微小调整。

输出:

{{1}}