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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:45:46