如何使用jq工具更新JSON中可变路径对应的内容?
问题分析与解决方法
错误原因
原命令存在三个核心问题:
- 遍历范围错误:
.[]会遍历所有顶级JSON元素,其中storageSummary是数值类型,尝试访问它的.value属性会触发解析错误,这就是你看到Invalid numeric literal报错的直接原因。 - 键名大小写不匹配:原JSON中字段是
satelliteName(驼峰式),但命令里写成了小写的satellitename,无法匹配目标字段。 - 逻辑冗余错误:不需要遍历所有元素再筛选,直接通过动态键访问目标对象即可。
正确实现方法
单次更新命令
直接通过.[$ds]访问动态指定的顶级键,然后修改其下的satelliteName字段:
DS_SRC_FILE="test.json" DS_OBJECT=$(jq -c '' "${DS_SRC_FILE}") ds="audit1" new_name="toto" # 执行更新并重新赋值给变量 DS_OBJECT=$(jq --arg ds "$ds" --arg name "$new_name" '.[$ds].satelliteName = $name' <<< "$DS_OBJECT") # 验证结果(可选) echo "$DS_OBJECT" | jq . # 将最终结果写入新文件 echo "$DS_OBJECT" > updated_test.json
多次更新示例
如果需要多次修改不同的键,只需重复执行更新步骤即可:
# 第一次更新audit1 ds="audit1" new_name="toto" DS_OBJECT=$(jq --arg ds "$ds" --arg name "$new_name" '.[$ds].satelliteName = $name' <<< "$DS_OBJECT") # 第二次更新audit2 ds="audit2" new_name="new_saltlake" DS_OBJECT=$(jq --arg ds "$ds" --arg name "$new_name" '.[$ds].satelliteName = $name' <<< "$DS_OBJECT") # 写入文件 echo "$DS_OBJECT" > final_updated.json
关键说明
- 使用
.[$ds]实现动态键访问,精准定位到目标对象,避免遍历无关元素。 - 注意JSON字段名的大小写严格匹配,原数据中是
satelliteName,必须完全一致。 - 每次更新后将结果重新赋值给
DS_OBJECT,实现多次修改后统一写入文件。
内容的提问来源于stack exchange,提问作者Burps
相关产品推荐
相关产品推荐

