回车 \r 和\r\n 的困惑

本周一直在linux下面处理一些CSV文件,因为是在linux中处理windows的CSV。所有碰到这两个操作系统对“回车”的不同定义。

linux中直接用   \n  定义回车

windows中用的是  \r\n 来定义回车。

这使得处理脚本的时候碰到个很头疼的问题。

在CSV文件中对回车还有区分:硬回车和软回车。硬回车就是我们平时直接说的回车。软回车,是在同一个单元格中实现的回车。这要在编辑CSV的时候强制实行才行(同时按下Alt + Enter)。

现在来描述一下问题:

因为CSV中有同时有软硬回车的出现。所以一行中会出现多个\n。但这些\n在windows中都不认为是换行符。因为windows认为的换行符是\r\n。可是在linux中就不一样了,linux认为\n是一行的结束。所以在windows下的一行,到linux中就变成了多行了。

为了处理这个问题。我的步骤如下:

1,tr -d '\n' < PIPESEG_F.CSV.4 > PIPESEG_F.4.no_n   --去掉文件中所有的\n,并保存到PIPESEG_F.4.no_n,这样PIPESEG_F.4.no_n中只有\r字符,没有\n.

2,echo '\n' > PIPESEG_F.4.no_n。追加\n到PIPESEG_F.4.no_n中,以便下面的sed命令执行。

3,sed 's/\r/\r\n/g' PIPESEG_F.4.no_n > PIPESEG_F.4_rn。用\r\n,替换所有的\r。此时PIPESEG_F.4_rn的行数要比源文件多一行,因为多了一个\n

4,sed '$d' PIPESEG_F.4_rn > PIPESEG_F.4_rn.res  删除文件结尾的一行,实际上这行只有一个\n符合而已,没有实际的数据.完成处理。


下面是我的理解,没有验证:因为sed是按行来读取文件的,而linux的一行是以\n结尾的。在第一步中去掉了所有的\n。这样直接用sed去把\r 替换成\r\n 是实现不了的。

猜你喜欢

转载自zzwssfd.iteye.com/blog/1734510