JSON 键通配
JSON key-globbing
在 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"}
]
假设我想 select Name
以 "ets" 结尾的所有对象,然后显示 Name
和 Sym*
形式的所有属性.关于这些属性,我所知道的是每个 JSON 对象将有一个或多个属性,名称的格式为 Sym
后跟两个字母的 ISO 国家/地区代码。
我只想这样做:
jq '.[] | select(.Name | endswith("ets")) | {Name, Sym*}'
但这不是一回事。
这不是 jq
设计用于在单个操作中处理的东西吗?我是否应该首先遍历文件以收集所有可能的密钥,然后通过 slurpfile
?
明确列出它们
简单解决问题的关键是to_entries
,如在线手册所述。使用您的示例数据,根据我的理解,以下过滤器会产生如下所示的输出:
.[]
| select(.Name | test("ets$"))
| {Name} + (to_entries | map(select(.key|test("^Sym"))) | from_entries)
您可能想要改进正则表达式测试,and/or 进行其他小的调整。
输出:
{
"Name": "Widgets",
"SymUS": "Widg",
"SymCN": "Zyin",
"SymJP": "Kono"
}
{
"Name": "Blodgets",
"SymUS": "Blodg",
"SymAU": "Blod",
"SymJP": "Kado"
}
在 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"}
]
假设我想 select Name
以 "ets" 结尾的所有对象,然后显示 Name
和 Sym*
形式的所有属性.关于这些属性,我所知道的是每个 JSON 对象将有一个或多个属性,名称的格式为 Sym
后跟两个字母的 ISO 国家/地区代码。
我只想这样做:
jq '.[] | select(.Name | endswith("ets")) | {Name, Sym*}'
但这不是一回事。
这不是 jq
设计用于在单个操作中处理的东西吗?我是否应该首先遍历文件以收集所有可能的密钥,然后通过 slurpfile
?
简单解决问题的关键是to_entries
,如在线手册所述。使用您的示例数据,根据我的理解,以下过滤器会产生如下所示的输出:
.[]
| select(.Name | test("ets$"))
| {Name} + (to_entries | map(select(.key|test("^Sym"))) | from_entries)
您可能想要改进正则表达式测试,and/or 进行其他小的调整。
输出:
{
"Name": "Widgets",
"SymUS": "Widg",
"SymCN": "Zyin",
"SymJP": "Kono"
}
{
"Name": "Blodgets",
"SymUS": "Blodg",
"SymAU": "Blod",
"SymJP": "Kado"
}