如何批量替换符合指定条件的多个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包)可以帮你简化流程——它会先读取所有输出内容,再一次性写入原文件,避免临时文件的繁琐:
先安装
moreutils:- Debian/Ubuntu系:
sudo apt install moreutils - RHEL/CentOS系:
sudo yum install moreutils
- Debian/Ubuntu系:
执行批量修改:
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




