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

如何用grep/awk/python正则匹配跨行方括号内的内容?

超大JSON文件提取ld数组元素解决方案

方案1:使用jq(最推荐,JSON专用流处理工具)

jq是专门处理JSON的轻量级命令行工具,支持流式读取超大文件,不需要一次性加载全部内容到内存,完全可以避免内存溢出问题,且不会出现正则匹配的边界错误。

命令示例

如果你的文件是普通的嵌套JSON结构,使用流模式命令:

jq -c --stream 'select(.[0][-1] == "ld") | .[1] | @csv' 你的文件路径

如果你的文件是每行一个JSON对象的JSON Lines格式,可以简化为:

jq -r '.ld | join(",")' 你的文件路径

参数说明

  • --stream:开启流模式,逐块读取文件,适配GB级以上超大文件
  • select(.[0][-1] == "ld"):筛选所有JSON路径末尾为ld的节点
  • .[1]:提取ld节点对应的数组内容
  • @csv/join(","):将数组元素转换为逗号分隔的单行格式,@csv会自动处理特殊字符转义,不需要转义可替换为join(",")

方案2:awk括号配对匹配方案(仅适用于无嵌套数组、字符串无未转义括号的场景)

如果环境无法安装jq,可以用awk实现括号配对逻辑,避免普通正则的匹配范围错误:

awk '/"ld":\s*\[/ {
    in_ld=1
    bracket_cnt=1
    line=""
    sub(/.*"ld":\s*\[/,"")
}
in_ld {
    for(i=1;i<=length($0);i++) {
        c=substr($0,i,1)
        if(c=="[") bracket_cnt++
        if(c=="]") bracket_cnt--
        if(bracket_cnt==0) {
            print line
            in_ld=0
            next
        }
        line=line c
    }
}' 你的文件路径 | sed 's/\s*\n\s*/ /g;s/\s*,\s*/,/g'

该脚本通过统计ld数组起始后的括号数量,匹配到对应结束括号才停止截取,适配跨多行的数组结构。

注意事项

  • 优先选择jq方案,当JSON结构存在嵌套数组、字符串包含未转义括号/引号等特殊场景时,正则/awk方案会出现解析错误,只有jq可以100%正确解析JSON结构
  • 两个方案均为流式处理,不会一次性加载全量文件,不会触发内存崩溃

内容的提问来源于stack exchange,提问作者Chronicflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:18:01