在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
明确列出所有密钥?
答案 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}}