You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何批量替换符合指定条件的多个JSON文件中的对象属性值?

批量修改多个JSON文件中符合条件的属性值

首先,你的命令没生效主要有两个原因:一是多余的引号转义(在bash/zsh等shell环境中,不需要转义双引号),二是jq默认只输出结果到标准输出,不会直接修改原文件。下面给你两种简单可靠的解决方案:

方案1:用临时文件批量处理(通用,无需额外工具)

这个方法适合所有环境,核心是先将修改后的内容写入临时文件,确认无误后再覆盖原文件,避免直接写入导致数据丢失:

for file in *.json; do
  # 对每个JSON文件执行jq修改逻辑,输出到临时文件
  jq 'if .identifier == "cameraA" then .rtsp = "cameraX" else . end' "$file" > temp.tmp
  # 覆盖原文件
  mv temp.tmp "$file"
done

方案2:用sponge工具(更简洁)

如果你能安装额外工具,sponge(来自moreutils包)可以帮你简化流程——它会先读取所有输出内容,再一次性写入原文件,避免临时文件的繁琐:

  1. 先安装moreutils

    • Debian/Ubuntu系:sudo apt install moreutils
    • RHEL/CentOS系:sudo yum install moreutils
  2. 执行批量修改:

for file in *.json; do
  jq 'if .identifier == "cameraA" then .rtsp = "cameraX" else . end' "$file" | sponge "$file"
done

关键细节说明

  • 引号问题:你原来命令里的\"cameraA\"是错误的——shell会把它解析成包含转义符的字符串\"cameraA\",而你的JSON里identifier的值是cameraA(没有转义),导致条件判断不成立,自然不会修改属性。直接用"cameraA"就可以正确匹配。
  • 数组场景适配:如果你的JSON文件是包含多个对象的数组(比如[{"identifier": "cameraA", ...}, ...]),只需要把jq命令改成:
    jq 'map(if .identifier == "cameraA" then .rtsp = "cameraX" else . end)'
    
    map()遍历数组里的每个对象,再执行修改逻辑。

内容的提问来源于stack exchange,提问作者Erik Martín Jordán

火山引擎 最新活动