如何使用Awk或Sed命令修复JSON数组误用大括号的格式错误?
问题核心
批量JSON存在固定格式错误:数组结构未使用[]包裹,反而错误使用{}包裹逗号分隔的纯值元素,错误块对应键名不固定,分散在数百个文件中。
错误结构示例:
"grid": { "C1", "D1", "E1", "C2", "D2", "E2", "F2", "B3", "C3", "D3", "E3", "F3", "B4", "C4", "D4", "E4", "F4", "C5", "D5", "E5", "F5", "C6", "D6", "E6" },
之前的脚本失效原因:
- 硬编码键名的sed脚本通用性极差,无法适配不同键名的错误块
- 手写的awk脚本仅在匹配到
grid关键字的分支中执行了打印动作,未设置全局默认打印逻辑,导致非匹配行全部丢失
可用方案
无额外依赖sed单行命令(推荐)
命令通过状态机识别错误块:匹配到"键名": {结构后进入检测状态,若块内仅存在逗号分隔的纯值、无键值对标志性的":结构,就判定为错误数组,将首尾的{}替换为[];若块内存在键值对则判定为正常JSON对象,不做修改,不会出现误替换。
单文件测试命令
先执行该命令将结果打印到终端,确认替换效果符合预期,不要直接修改原文件:
sed ' /"[^"]*": *[[:space:]]*{/{ s/{/[/ :loop n /"/{/":/{x;s/\[/\{/;x;b}} /[[:space:]]*},[[:space:]]*$/{s/}/]/;b} b loop } ' test.json
批量修改命令
确认测试无误后,配合find批量处理当前目录下所有JSON文件,执行前务必备份全部原文件:
find . -type f -name "*.json" -exec sed -i ' /"[^"]*": *[[:space:]]*{/{ s/{/[/ :loop n /"/{/":/{x;s/\[/\{/;x;b}} /[[:space:]]*},[[:space:]]*$/{s/}/]/;b} b loop } ' {} \;
修正版awk单行
如果更习惯awk语法,可使用以下修正后的脚本,默认打印所有行,不会出现内容丢失问题:
awk ' { if (match($0, /"[^"]+":[[:space:]]*\{/)) { in_err_arr = 1 sub(/\{/, "[") } if (in_err_arr) { if (/"/ && /":/) { sub(/\[/, "{") in_err_arr = 0 } else if (/[[:space:]]*},[[:space:]]*$/) { sub(/\}/, "]") in_err_arr = 0 } } print } ' test.json
校验方式
修复完成后,可通过以下命令逐文件校验JSON格式合法性,排查漏改、误改问题:
# 校验单个文件格式 jq . 修复后的文件.json > /dev/null && echo "格式合法" || echo "格式仍有错误"
内容的提问来源于stack exchange,提问作者OnlyDean
相关产品推荐
相关产品推荐

