Linux下如何用含变量的字典替换JSON中的数组字典
批量替换JSON数组时含变量的正确实现方法
问题场景
已能通过纯文本替换JSON文件中的数组:
原sample.json内容:
{ "persons": [ { "name": "test1", "age": 20 }, { "name": "test2", "age": 21 } ] }
纯文本替换命令:
DATA='[{"name": "tony", "age": 22}]' jq --argjson newdata "$DATA" '.persons[0] = $newdata' sample.json > tmp && mv tmp sample.json
但当替换内容包含shell变量时,执行以下命令会报错:
NAME="namevar" DATA="[{"name": "$NAME", "age": 22}]" jq --argjson newdata "$DATA" '.persons = $newdata' sample.json > tmp && mv tmp sample.json
错误提示:
jq: invalid JSON text passed to --argjson Use jq --help for help with command-line options, or see the jq manpage, or online docs at https://stedolan.github.io/jq
期望替换后sample.json内容:
{ "persons": [ { "name": "namevar", "age": 20 } ] }
错误原因
原命令中DATA的定义存在两个问题:
- 外层用双引号包裹JSON字符串,内部的双引号会被shell解析,直接破坏JSON结构;
- 变量
$NAME替换后,生成的字符串未被引号包裹,导致最终传递给--argjson的内容不是合法JSON。
正确解决方案
方法一:用jq的--arg传递变量(推荐)
无需手动拼接JSON字符串,直接通过--arg将shell变量传入jq,在jq表达式中构建目标数组:
NAME="namevar" jq --arg newname "$NAME" '.persons = [{"name": $newname, "age": 20}]' sample.json > tmp && mv tmp sample.json
这种方式由jq自动处理JSON格式,从根源避免拼接错误。
方法二:正确拼接JSON字符串
如果需要先构造完整的JSON字符串,需对引号进行转义或采用正确的拼接方式:
NAME="namevar" # 用单引号包裹JSON固定部分,变量部分单独拼接 DATA='[{"name": "'"$NAME"'", "age": 20}]' jq --argjson newdata "$DATA" '.persons = $newdata' sample.json > tmp && mv tmp sample.json
通过单引号+双引号的组合,确保变量替换后生成的是合法JSON。
批量替换多个JSON文件
如果需要处理目录下所有JSON文件,可结合shell循环实现:
NAME="namevar" for json_file in *.json; do jq --arg newname "$NAME" '.persons = [{"name": $newname, "age": 20}]' "$json_file" > tmp && mv tmp "$json_file" done
内容的提问来源于stack exchange,提问作者moluzhui
相关产品推荐
相关产品推荐

