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" 结尾的所有对象,然后显示 NameSym* 形式的所有属性.关于这些属性,我所知道的是每个 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"
}