回车 \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 是实现不了的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值