You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:18:17