如何使用 jq 更新 JSON 中带有特殊字符(如 $schema)的 Key
在处理现代 JSON 配置文件(如 VS Code 配置、NPM 封装或自定义 Schema)时,经常会遇到以 $ 开头的字段名。在使用 jq 进行命令行修改时,直接使用点号(.)访问会导致语法错误。
1. 常见错误现象
当你尝试运行以下命令更新 $schema 字段时:
jq '.$schema = "https://example.com/config.json"' config.json
报错信息:
jq: error: syntax error, unexpected BINDING...
jq: error: try .["field"] instead of .field for unusually named fields
原因分析: 在 jq 语法中,$ 符号预留给变量使用。当解析器看到 .$schema 时,它会产生歧义,误以为你在引用一个名为 schema 的变量,而不是一个名为 $schema 的字符串键名。
2. 正确解决方案:使用方括号引号法
对于包含特殊字符(如 $, @, ., - 或空格)的 Key,必须使用 ["key_name"] 的格式来明确指定路径。
正确命令:
jq '.["$schema"] = "https://opencode.ai/config.json"' ~/.config/opencode/opencode.json > updated.json
3. 进阶:配合环境变量安全更新
如果你在 Shell 脚本中操作,建议使用 --arg 参数来传递变量。这不仅能解决特殊字符问题,还能防止复杂的转义错误:
NEW_URL="https://opencode.ai/config.json"
# 将外部变量 $NEW_URL 映射为 jq 内部变量 $url
jq --arg url "$NEW_URL" '.["$schema"] = $url' config.json > tmp.json && mv tmp.json config.json
总结
- 普通 Key:使用
.keyname。
- 特殊 Key(含
$, - 等):必须使用 .["$keyname"]。
- 原地修改:
jq 不支持 -i 参数,需通过临时文件重定向或配合 sponge 工具完成。