jq 1.5:未知父级时通过正则查找嵌套元素并添加子对象
解决jq递归查找第一个ccc对象并更新其子元素的问题
嘿,我来帮你搞定这个困扰你的jq问题!你遇到的jq: error (at <stdin>:1): number (0) cannot be matched, as it is not a string错误,本质是因为你的JSON里存在数组结构,当递归查找时遇到了数字类型的数组索引,但之前的jq命令没正确处理这种数字路径,导致匹配失败。
核心解决方案
要在未知嵌套层级和父键名的情况下,找到第一个包含ccc键的对象(或者说第一个ccc对象),并给它的ddd子元素添加新内容,可以用以下jq命令:
情况1:ddd是数组(添加新元素)
jq ' (first(.. | select(type == "object" and has("ccc")))).ccc.ddd += [{"new_key": "new_value"}] ' your_input.json
情况2:ddd是对象(添加新键值对)
jq ' (first(.. | select(type == "object" and has("ccc")))).ccc.ddd += {"new_key": "new_value"} ' your_input.json
命令解释
..:递归遍历JSON的所有节点,不管嵌套多深,也不管是对象还是数组select(type == "object" and has("ccc")):筛选出所有包含ccc键的对象(避免误匹配数组或其他类型节点)first():只取第一个符合条件的对象,确保我们只修改第一个找到的ccc对象.ccc.ddd += ...:对目标ccc对象下的ddd执行添加操作,根据ddd的类型选择数组或对象的添加语法
示例演示
假设你的输入JSON是这样的:
{ "top_level": { "nested_array": [ { "ccc": { "ddd": [{"existing_item": "old_val"}] } }, { "ccc": { "ddd": [] } } ] } }
运行第一个命令后,输出会变成:
{ "top_level": { "nested_array": [ { "ccc": { "ddd": [ {"existing_item": "old_val"}, {"new_key": "new_value"} ] } }, { "ccc": { "ddd": [] } } ] } }
可以看到只有第一个ccc对象的ddd数组被添加了新元素。
为什么之前会报错?
你之前的命令可能使用了路径相关的操作(比如paths或getpath),但没有处理数组的数字索引——jq的路径中数组索引是数字类型,如果你尝试把它当作字符串来匹配或操作,就会触发这个错误。而上面的方案用..和select直接遍历节点,避开了路径字符串匹配的问题,自然不会报错。
内容的提问来源于stack exchange,提问作者art vanderlay
相关产品推荐
相关产品推荐

