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

如何在Linux Bash中用jq(v1.5)通过变量修改JSON字段与值?

解决jq修改JSON的字段重命名与变量赋值问题

你的jq 1.5版本完全支持这些操作,只是之前的命令在语法和变量传递上有小问题,我来一步步帮你搞定:

先理清核心需求

你需要完成这几个操作:

  • 把plants下的flowers.small键重命名为变量var2的值(european.flowers)
  • 给这个新键下的colour字段赋值为var1(red)
  • 把新键下的vegetables键重命名为var3的值(european_vegetables)
  • 给这个内层新键下的height字段赋值为var4(20)

修正变量传递与语法错误

你之前遇到的问题:

  1. 直接用"${var1}"会被jq当成字符串字面量,因为shell的变量展开在单引号里不会生效,必须用jq的--arg参数传递变量。
  2. .plants.["flowers.small"]是语法错误,正确的索引方式是.plants["flowers.small"](不需要多那个.);另外[$v]会把值包装成数组,你要的是直接赋值字符串,所以应该用$v而不是[$v]。

完整的jq命令

结合所有需求,最终的命令应该是这样的:

var1="red" var2="european.flowers" var3="european_vegetables" var4="20"
cat myjson.json | jq --arg v1 "$var1" --arg v2 "$var2" --arg v3 "$var3" --arg v4 "$var4" '
.plants[$v2] = .plants["flowers.small"] | 
del(.plants["flowers.small"]) | 
.plants[$v2].colour = $v1 | 
.plants[$v2][$v3] = .plants[$v2].vegetables | 
del(.plants[$v2].vegetables) | 
.plants[$v2][$v3].height = $v4
' -c

命令解释

  • --arg v1 "$var1":把shell变量var1传递给jq,在jq里用$v1引用
  • .plants[$v2] = .plants["flowers.small"]:把旧键flowers.small的值复制给新键(var2的值)
  • del(.plants["flowers.small"]):删除原来的旧键
  • 后面的步骤同理:先复制内层vegetables的值到新键$v3,删除旧键,再给height赋值$v4

验证结果

执行这个命令后,你会得到期望的JSON:

{"plants":{"european.flowers":{"colour":"red","age":"","european_vegetables":{"root":"","height":"20"}}}}

内容的提问来源于stack exchange,提问作者Anna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:30:23