You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:10:26