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

如何使用jq修改JSON文件中的值并保存到原文件

如何直接修改并覆盖原JSON文件?

首先,先明确你的场景:你有这样的JSON文件内容:

{ 
  "src": "ssh://git@bitbucket.org/myrepos/project", 
  "version": "master", 
  "archetype_version": "master", 
  "roles": [ { "src": "ssh://git@bitbucket.org/myrepos/project", "version": "master" } ] 
}

你目前用了多条jq命令管道输出到新文件file2.json:

cat file.json | jq '.roles[0].version = "new"' | jq '.version = "new"' | jq '.archetype_version = "new"' > file2.json

现在需要把修改结果直接保存回原文件file.json,而不是新文件,这里有几个可靠的方法:

方法1:使用jq原生的原地修改参数(推荐)

现代版本的jq支持--in-place(缩写-i)参数,它会直接修改原文件,不需要额外的重定向操作。同时,你可以把多个修改操作合并成一条jq命令,比多次调用jq效率更高:

jq -i '.version = "new" | .archetype_version = "new" | .roles[0].version = "new"' file.json

这里的|是jq内部的管道,用来依次执行多个修改操作,一次完成所有字段的更新。-i参数会自动处理文件的读取和覆盖,安全可靠。

方法2:使用临时文件兼容旧版本jq

如果你的系统上安装的jq版本比较旧,不支持-i参数,可以用临时文件中转的方式,避免直接重定向清空原文件:

tmp=$(mktemp) && jq '.version = "new" | .archetype_version = "new" | .roles[0].version = "new"' file.json > "$tmp" && mv "$tmp" file.json

这个方法的逻辑是:

  • 先创建一个临时文件
  • 将修改后的JSON内容写入临时文件
  • 确认写入成功后,用临时文件替换原文件
    这样即使修改过程中出错,原文件也不会被损坏。

⚠️ 重要提醒:绝对不要直接用jq ... file.json > file.json,因为Shell会先清空输出文件(也就是你的原文件),然后才去读取输入文件,最终会导致原文件被清空,数据丢失!

内容的提问来源于stack exchange,提问作者Souad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:08:44