sed 不适合处理 JSON,因其无法解析嵌套结构、引号转义、空白符等语法特性,易破坏数据;推荐使用专为 JSON 设计的 jq 工具进行安全可靠的处理。

直接用 sed 处理复杂 JSON 字符串非常危险,不推荐。因为 sed 是基于正则的行编辑器,无法正确解析嵌套结构、引号转义、换行、空格敏感等 JSON 特性,极易误匹配或破坏数据完整性。
为什么 sed 不适合处理 JSON
sed 无法识别 JSON 的语法边界。例如:
- 字段名和字符串值都用双引号包裹,但引号内可能含转义字符(如
"name": "Alice \"Junior\""); - 值可能是对象、数组、布尔、null,结构深度不一;
- 同一行多个字段时,正则难以精准锚定目标键(比如
"id"可能出现在值里,而非键名); - JSON 允许空白符任意分布,
sed正则很难鲁棒匹配。
推荐方案:用 jq 替代 sed
jq 是专为 JSON 设计的命令行处理器,安全、可靠、表达力强。安装后即可使用:
- 修改单个字段:
echo '{"name":"Tom","age":25}' | jq '.age = 26' - 修改嵌套字段:
jq '.user.profile.email = "new@ex.com"' - 条件更新(如只改 age > 20 的记录):
jq 'if .age > 20 then .age += 1 else . end' - 从变量注入值:
AGE=27; jq --arg a "$AGE" '.age = ($a | tonumber)'
实在要用 sed 的极简场景(仅限简单、固定格式)
仅当满足全部条件时才可谨慎尝试:单行、无嵌套、无转义引号、键名唯一且位置稳定。例如:
sed 's/"version":[[:space:]]*"[^"]*"/"version": "2.1.0"/'
注意:
- 必须用
[[:space:]]*匹配可能的空格; - 用
[^"]*避免贪婪匹配到后续引号; - 不能处理
"version":"1.0.0","name":"v1"中的逗号干扰; - 一旦 JSON 格式变化(如换行、缩进、转义),该命令立即失效或出错。
混合处理:先用 jq 提取/生成,再用 sed 做轻量文本修补
如果流程中已有非 JSON 部分需处理,可分步操作:
- 用
jq -r '.field' file.json提取纯文本值; - 用
sed处理该值(如替换其中某单词); - 再用
jq将处理后的值写回原结构:jq --arg v "$(echo "$old" | sed 's/old/new/')” '.field = $v'。
真正可靠的 JSON 修改,始终依赖语义解析器。jq 是 Linux 下事实标准,学习成本低,远比调试脆弱的 sed 正则更省时省力。


















