如何用sed/awk/tr处理大体积伪JSON文件替换换行符添加逗号
解决方案
问题原因
你之前的sed命令不生效是因为sed默认逐行读取内容到模式空间,模式空间中默认不包含行尾的换行符,所以直接匹配\n无法命中目标组合。
方案1:GNU sed 低内存占用方案(推荐,适合20GB大文件)
这个方案不会一次性加载整个文件,仅逐行处理,内存占用极低:
sed '/^[[:space:]]*}[[:space:]]*$/{N;s/}\n{/},\n{/}' test.json
命令说明
- 首先匹配仅包含闭合大括号(允许前后有空白字符)的行:
/^[[:space:]]*}[[:space:]]*$/ - 匹配到后执行
N命令,将下一行内容追加到当前模式空间,此时模式空间内会包含两行内容和中间的换行符 - 执行替换逻辑,将
}\n{替换为},\n{,完成加逗号的需求
如果你的源文件中}和{前后完全没有空白字符,可以把正则简化为/^}$/。因为最后一个闭合大括号后没有下一行内容,N命令执行失败会直接输出原内容,刚好满足最后一个大括号不加逗号的要求。
方案2:awk 兼容方案
如果需要更高的兼容性,可以用awk实现,同样是逐行处理,内存占用低:
awk '{if(prev ~ /^[[:space:]]*}[[:space:]]*$/ && $0 ~ /^[[:space:]]*{[[:space:]]*$/) print prev","; else if (prev != "") print prev; prev=$0} END{print prev}' test.json
命令说明
- 缓存上一行的内容,每次读取新行时判断:如果上一行是单独的闭合大括号、当前行是单独的起始大括号,就输出上一行加逗号
- 其余情况正常输出上一行,最后输出缓存的最后一行内容,避免最后一个闭合大括号后多加逗号
内容的提问来源于stack exchange,提问作者user3037237
相关产品推荐
相关产品推荐

