如何在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)
修正变量传递与语法错误
你之前遇到的问题:
- 直接用
"${var1}"会被jq当成字符串字面量,因为shell的变量展开在单引号里不会生效,必须用jq的--arg参数传递变量。 .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
相关产品推荐
相关产品推荐

