jq工具:如何仅保留匹配指定模式的键并原样输出输入JSON?
用jq提取匹配特定模式的键值对
没问题,要从你的JSON数组里提取所有键名以Sym开头的内容,用jq可以轻松搞定,我给你两种常用的实现方式,都很直观:
1. 基础用法:遍历并筛选每个对象
如果你想逐个输出每个对象中符合条件的键值对,可以用下面的命令:
jq '.[] | with_entries(select(.key | startswith("Sym")))'
各部分解释:
.[]:遍历输入数组中的每一个对象;with_entries(...):把对象转换成{"key": "...", "value": "..."}的条目数组,处理完后再转回对象格式;select(.key | startswith("Sym")):筛选出键名以Sym开头的条目(startswith比正则更直白,适合这种前缀匹配的场景)。
2. 保留数组结构
如果你希望输出结果还是一个完整的JSON数组(而不是一个个独立的对象),只需要把整个表达式包裹在数组括号里:
jq '[ .[] | with_entries(select(.key | startswith("Sym"))) ]'
示例演示
用你给出的输入片段:
[ {"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"} ]
运行第一个命令会输出:
{"SymUS":"Widg","SymCN":"Zyin","SymJP":"Kono"} {"SymUS":"Blodg","SymAU":"Blod","SymJP":"Kado"} {"SymRU":"Fyet"}
运行第二个命令会输出:
[ {"SymUS":"Widg","SymCN":"Zyin","SymJP":"Kono"}, {"SymUS":"Blodg","SymAU":"Blod","SymJP":"Kado"}, {"SymRU":"Fyet"} ]
可选:用正则匹配更复杂的模式
如果你的匹配需求更复杂(比如键名包含Sym但不一定在开头),可以用test函数结合正则表达式,比如筛选键名包含Sym的所有键:
jq '.[] | with_entries(select(.key | test("Sym")))'
内容的提问来源于stack exchange,提问作者dg99
相关产品推荐
相关产品推荐

