如何用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
相关产品推荐
相关产品推荐

