如何使用jq命令永久写入JSON数据 实现类似sed -i原地修改效果
jq实现JSON文件原地修改的方法
jq 1.6及以上版本原生提供了和sed -i效果完全一致的原地修改参数,不需要额外生成中间文件,直接加-i(长参数写法为--in-place)即可将修改永久写入原文件。
针对你修改镜像地址的场景,直接执行以下命令即可:
jq -i --arg img "$IMAGE" '.containerDefinitions[].image = $img' taskdef.json
注意:这里用
--arg参数把环境变量传入jq,而不是直接在jq表达式里拼接"$IMAGE",可以避免变量内容包含特殊字符时导致jq语法解析错误,是更稳妥的传参方式。
如果你使用的jq版本低于1.6,没有内置-i参数,可以通过临时文件过渡的方式实现等效效果,避免直接重定向到原文件导致文件被清空的问题:
tmp_file=$(mktemp) jq --arg img "$IMAGE" '.containerDefinitions[].image = $img' taskdef.json > "$tmp_file" && mv "$tmp_file" taskdef.json
如果需要对同一个JSON文件做多次字段注入,有两种可选方案:
- 每次字段修改都单独执行带
-i参数的jq命令,修改会直接写入原文件,不需要手动处理文件替换 - 把多个字段修改逻辑合并到同一个jq表达式中,一次执行完成所有修改,比如同时修改镜像地址和日志区域:
jq -i \ --arg img "$IMAGE" \ --arg log_region "us-west-1" \ ' .containerDefinitions[].image = $img | .containerDefinitions[].logConfiguration.options."awslogs-region" = $log_region ' taskdef.json
重要提醒:不要尝试直接执行jq 表达式 taskdef.json > taskdef.json,Shell会在jq命令启动前先截断清空原文件,最终会得到一个0字节的空文件,导致原配置丢失。
内容的提问来源于stack exchange,提问作者Bl4cKni9ht
相关产品推荐
相关产品推荐

