如何在jq中转义变量newValue以替换含点号的JSON键对应值?
解决jq替换带点键下的version值时变量未解析的问题
要解决这个问题,核心是两点:正确访问带点的JSON键,以及安全传递Shell变量给jq,具体方法如下:
1. 访问带点键的正确语法
JSON中带点的键(比如two.two)不能直接用.two.two访问(这会被jq解析为two对象下的two子键),必须用以下两种方式之一:
- 引号包裹键名:
."two.two" - 数组索引语法:
["two.two"]
2. 安全传递Shell变量给jq
直接在jq脚本里写$newvalue会因为引号问题导致变量无法被Shell解析,最稳妥的方式是用jq的--arg参数将Shell变量传入jq环境:
示例脚本
假设你的JSON文件为data.json,内容如下:
{ "one": { "version": "0.0.1" }, "two.two": { "version": "0.0.2" } }
执行以下命令即可完成替换:
# 定义Shell变量 newvalue="1.2.3" # 使用jq替换指定键下的version值 jq --arg newver "$newvalue" '."two.two".version = $newver' data.json
直接修改原文件(可选)
如果需要直接修改原JSON文件(jq 1.5及以上版本支持),添加-i选项:
jq -i --arg newver "$newvalue" '."two.two".version = $newver' data.json
为什么之前的方法无效?
- 用单引号包裹jq脚本时,Shell不会解析脚本内的
$newvalue,直接将其作为字符串传递给jq; - 用双引号包裹jq脚本时,虽然Shell会解析变量,但带点的键名容易引发语法冲突,且存在注入风险;
- 使用
--arg参数可以将Shell变量安全传入jq,完全避免引号转义和变量解析的问题。
内容的提问来源于stack exchange,提问作者clogwog
相关产品推荐
相关产品推荐

