技术员联盟提供win764位系统下载,win10,win7,xp,装机纯净版,64位旗舰版,绿色软件,免费软件下载基地!

当前位置:主页 > 教程 > 服务器类 >

windows和linux、Mac系统换行规则的区别

来源:技术员联盟┆发布时间:2018-07-17 06:07┆点击:

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

  于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做"回车",告诉打字机把打印头定位在左边界;另一个叫做"换行",告诉打字机把纸向下移一行。

  这就是"换行"和"回车"的来历,从它们的英语名字上也可以看出一二。

  后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

  Unix系统里,每行结尾只有"<换行>",即"n";Windows系统里面,每行结尾是"<回车><换行>",即"rn";Mac系统里,每行结尾是"<回车>"。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

  因此在linux下创建的文本文件在windows中会连成一行,因为windows认为没有换行符(CRLF)。

  在windows下创建的文本文件在linux中可能会出现每一行后面多了一个^M,这个^M要用ctrl + v ctrl + m打出,代表的意思就是CR(Carriage Return).

  说到这里有人也许会问,为什么我在windows下创建的文本文件,在linux中显示正常呢?

  例如,我在windows下创建一个文本文件a.txt,放到我的linux中,用vim打开

windows和linux、Mac系统换行规则的区别 三联

  可以看到显示结果正常,行的结尾并没有^M符号。这是因为vim在打开文件时,会自动检测换行符,如果文本的所有换行符都是^M$(CRLF, 即windows的换行标记),那么vim会自动以dos格式显示文本内容,忽略掉每一行结尾的^M$,因此文本显示是正常的。

  注意上面我图片的两个箭头指示的vim编辑器最下方的两个标志[noeol]和[dos],先来解释第二个标志"[dos]",这表示vim识别到文本的每一行都是^M$的换行符,因此vim自动以dos文本格式来显示文件。所以我们看到文本显示是正常的。

  那么为什么有的时候windows下创建或编辑的文件在linux下会出现^M呢,vim不是能自动识别吗?这是因为,vim会检查文本的每一行换行符,只要有一行的换行符不是windows格式,那么vim就会以unix文件格式来显示文件,这时换行符为$, 因此我们会看到文本的行后面多了一个^M符号。

  这里我用cat -A显示文件的特殊符号:

windows和linux、Mac系统换行规则的区别

  文件一共四行,可以看换行符都是^M$(箭头所指),因此vim会用[dos]文件格式来显示这个文本。

  这里还可以发现文件的最后一行没有换行符,这就是第一张图vim中的[noeol]标志的由来 ,因为在windows下处理的文本,最后一行是不会加上换行符的,而linux下创建的文本的规则是每一行都有换行符,包括最后一行。因此vim会提示no end-of-line, 告诉我们这个文件包含没有换行符结束的行。

  用wc -l统计这个文件的行数:

windows和linux、Mac系统换行规则的区别

  结果是3行,少了一行,原因是文件的最后一行没有换行符。

  我在linux下用vim编辑一个新文件,内容和刚刚的a.txt一样,用cat -A查看:

windows和linux、Mac系统换行规则的区别

  可以看到linux下创建的文本,每一行都是有换行符的,包括最后一行,用wc -l统计行数:

windows和linux、Mac系统换行规则的区别

  这时统计结果正确。

  再用sed替换windows下创建的a.txt, 将其中一行的换行符^M$中的^M去掉,变成linux的换行符$

windows和linux、Mac系统换行规则的区别

  这里我把文件的第二行的换行符替换成了linux格式的$,注意sed命令中的^M

  在命令行中不是直接输入,而是 ctrl+v和ctrl+m. 再用vim打开这个文件:

windows和linux、Mac系统换行规则的区别