使用Sed修复CSV文件中字符串内的多余换行问题
使用Sed修复CSV文件中字符串内的多余换行问题
看起来你遇到的是CSV文件里字段被不必要的换行拆得七零八落的问题,想要用sed把这些零散的行合并回正确的格式对吧?我先理清楚你的场景和需求,再给你靠谱的解决方案。
你的当前CSV内容:
COl1,COl2,COl3,COl4,COL5 AAA1,AAA1,AAA1,AAA1,AAA1 BBB10,BB11 ,BB22,BB33 BB44 CCCC,CCC1,CCC2,CCC3 ,CCC4,CCC5
期望修复后的内容:
COl1,COl2,COl3,COl4,COL5 AAA1,AAA1,AAA1,AAA1,AAA1 BBB10,BB11,BB22,BB33,BB44 CCCC,CCC1,CCC2,CCC3
你的核心需求其实是两种跨行合并场景:
- 场景1:如果某一行结束后,下一行以逗号开头,说明这是上一行字段的延续,需要去掉换行合并
- 场景2:如果某一行的字段数量还没达到CSV的列数(你的是5列,对应4个逗号),说明后续行是内容续接,也要去掉换行合并
之前你用的sed -z -i 's/\n,*/.../g' filename没效果,是因为-z会把文件当成null分隔的内容,而且替换成...也不是你要的合并逻辑,咱们换个正确的写法:
方案1:先处理「下一行以逗号开头」的合并
这个命令会循环查找所有换行后紧跟逗号的情况,把换行去掉:
sed -i ':a;N;s/\n,/,/;ta' filename
我给你拆解下这个命令的逻辑:
:a定义一个名为a的循环标签N把下一行内容读入到当前处理的缓冲区里s/\n,/,/把「换行+逗号」替换成「逗号」,也就是去掉多余的换行ta如果刚才的替换成功了,就跳回标签a继续循环处理,避免漏过连续多行的情况
方案2:处理「字段数不足」的合并
你的CSV是5列,所以正常行应该有4个逗号。这个命令会把字段数不够的行和下一行合并:
sed -i ':a;N;/^\(.*,\)\{4\}$/!s/\n//;ta' filename
逻辑拆解:
:a同样定义循环标签N读入下一行/^\(.*,\)\{4\}$/!判断当前缓冲区里的内容是否不满足「有4个逗号」(也就是字段数不够5个)s/\n//如果满足判断条件,就去掉换行合并两行ta替换成功后跳回标签a继续处理,直到当前行的字段数达标
组合方案:一次性处理两种场景
把两个逻辑结合起来,先处理逗号开头的跨行,再处理字段不足的跨行,这样就能得到你想要的结果:
# 先备份原文件,避免误操作 cp filename filename.bak # 执行合并命令 sed -i ':a;N;s/\n,/,/;ta;:b;N;/^\(.*,\)\{4\}$/!s/\n//;tb' filename
运行这个命令后,你的CSV就会变成期望的格式啦。
备注:内容来源于stack exchange,提问作者user10820864
相关产品推荐
相关产品推荐

