如何通过Bash与jq实现JSON嵌套路径的键值更新/插入?
用Bash和jq动态更新嵌套JSON路径的键值(不存在则插入)
你需要通过变量传递JSON的嵌套路径(如Serilog.WriteTo[0].Name)来更新对应值,但直接使用--arg传递路径字符串时遇到了问题:
- 尝试
.$name = $value触发语法错误 - 改用
.[$name] = $value生成了扁平键名,而非期望的嵌套结构
解决方案:使用jq的setpath函数解析嵌套路径
jq无法直接将带点和数组下标的字符串识别为嵌套路径,需要先把路径字符串转换为jq能识别的路径数组,再用setpath设置值。
方法1:自动拆分路径字符串
适合从外部接收完整路径字符串的场景:
jq --arg path_str "Serilog.WriteTo[0].Name" --arg value "Pluto" ' # 将路径字符串按点拆分,处理数组下标为数字类型 ($path_str | split(".") | map( if test("^\\[\\d+\\]$") then .[1:-1] | tonumber else . end )) as $path | # 根据路径数组设置值,不存在的结构自动创建 setpath($path; $value) ' appsettings.json.tpl > appsettings.json
方法2:直接传递路径数组(更高效)
如果可以提前构造路径数组,用--argjson直接传递:
jq --argjson path '["Serilog", "WriteTo", 0, "Name"]' --arg value "Pluto" ' setpath($path; $value) ' appsettings.json.tpl > appsettings.json
执行结果
两种方法都会生成你期望的嵌套JSON结构:
{ "Serilog": { "WriteTo": [ { "Name": "Pluto" } ] } }
内容的提问来源于stack exchange,提问作者Enry
相关产品推荐
相关产品推荐

