Linux和Windows的换行符

一直对换行符这个东西概念比较模糊,直到最近花了一点时间仔细研究了一下,才彻底搞清楚这个问题,本文前面介绍部分是外文转载,后面例子是个人总结,希望能对大家有一些帮助。

回车符号和换行符号产生背景

关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。

在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

Unix 系统里,每行结尾只有“<换行>”,即“\n”,十六进制数值是:0A;

Windows系统里面,每行结尾是“ <回车><换行>”,即“ \r\n”,十六进制数值是:0D0A;

Mac系统里,每行结尾是“<回车>”。即“\r”,十六进制数值是:0D;

一个直接后果是,Unix系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾可能会多出一个^M符号

实际观测一:

在Windows下建立一个文本文件file.txt,内容如下(在UltraEdit或NotePad++下面查看):

在Linux下用od查看,的确看到每行以CRLF结尾

qqxxz@IED42_83_sles10:~$ od -x file.txt

0000000 0d61 620a 0a0d

0000006

使用vim查看

显示正常,说明CR被vim忽略掉了

使用dos2unix转换一下

qqxxz@IED42_83_sles10:~$ dos2unix file.txt

dos2unix: converting file file.txt to UNIX format ...

qqxxz@IED42_83_sles10:~$ od -x file.txt  

0000000 0a61 0a62

0000004

发现CR被删除了,每行的结尾只剩下了LF

实际观测二:

但是如果我们把文件转化为mac格式(以CR结尾)

在linux用od查看,看到每行是以CR结尾

qqxxz@IED42_83_sles10:~$ od -x file.txt

0000000 0d61 0d62

0000004

使用vim查看

就变成了所有内容都在一样,并且有很多^M,这个^M实际上就是CR,而由于没有LF,因此linux无法识别出换行信息。

解决:

1 去掉^M

1)在vim使用替换命令

:1,$ s/^M//g

^M使用ctrl-V,ctrl-M输入

2)使用tr来清除

cat file.txt |tr -d "\r" > newfile.txt

3)直接使用dos2unix

2 将^M替换为CRLF

1)直接使用mac2unix

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逍遥剑客的游戏开发

Ogitor代码分析

14520
来自专栏机器学习算法与Python学习

Python再次更新! 解锁与优化多项新特性......

Python 3.7.0 版本于 6 月 27 号正式发布,该版本有多项重大的更新和改进,主要内容如下如下:

11800
来自专栏程序员与猫

Go Code Review Comments 译文(截止2018年7月27日)

持续更新中… 原文最新链接 https://github.com/golang/go/wiki/CodeReviewComments/5a40ba36d38...

22130
来自专栏用户2442861的专栏

最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

http://blog.csdn.net/lanxuezaipiao/article/details/24845625

1.4K20
来自专栏企鹅号快讯

python中any和all如何使用

python中any()和all()如何使用 和 对于检查两个对象相等时非常实用,但是要注意, 和 是python内置函数,同时numpy也有自己实现的 和 ,...

22550
来自专栏数据科学与人工智能

【Python环境】Python性能优化的20条建议

优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间...

272100
来自专栏喔家ArchiSelf

全栈必备JavaScript基础

1995年,诞生了JavaScript语言,那一年,我刚刚从大学毕业。在今年RedMonk 推出的2017 年第一季度编程语言排行榜中,JavaScript 排...

13740
来自专栏AI研习社

Python 3.7.0 发布,包含多项新特性和优化

Python 3.7.0 版本于 6 月 27 号正式发布,该版本有多项重大的更新和改进,主要内容如下如下:

9710
来自专栏对角另一面

lodash源码分析之chunk的尺与刀

以不正义开始的事情,必须用罪恶使它巩固。 ——莎士比亚《麦克白》 最近很多事似乎印证了这句话,一句谎言最后要用一百句谎言来圆谎。 本文为读 lodash...

23400
来自专栏程序员互动联盟

【问题追踪】scanf引发的“血案”

最近我遇到C语言学习中一个比较容易让我们这种新手犯错或者忽略的地方。那就是关于scanf函数在读取字符时的问题,以及getchar()与回车的一点恩恩怨怨,换句...

29760

扫码关注云+社区

领取腾讯云代金券