如何使用jq命令过滤JSON,保留路径或值含指定模式的内容?
符合需求的jq命令
要实现过滤JSON文件,仅保留完整路径或叶子节点值中任意位置包含指定模式的内容,对应的jq命令如下:
jq --arg pattern "foo" ' def has_match: (tostring | test($pattern)) or (objects | with_entries(select(.value | has_match)) | length > 0) or (arrays | any(.[] | has_match)); .. | objects |= with_entries(select(.key | test($pattern) or .value | has_match)) ' input.json
命令说明
--arg pattern "foo":将匹配模式以变量形式传入,后续只需修改引号内的内容即可更换匹配目标,无需改动核心逻辑。has_match自定义函数:- 先检查当前值转为字符串后是否匹配模式;
- 若当前值是对象,递归检查其子条目是否存在匹配项,只要有一个符合就返回true;
- 若当前值是数组,检查数组中是否有元素符合匹配条件。
- 递归过滤对象条目:通过
..递归遍历所有JSON节点,对每个对象仅保留两种条目:- 键名本身匹配模式的条目;
- 值(或其后代节点)存在匹配内容的条目。
验证效果
将你提供的示例JSON保存为input.json,执行上述命令后,输出结果与预期完全一致。
内容的提问来源于stack exchange,提问作者JBT
相关产品推荐
相关产品推荐

