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

2016-03-31 15:57 50 1 收藏

下面图老师小编跟大家分享windows和linux、Mac系统换行规则的区别,一起来学习下过程究竟如何进行吧!喜欢就赶紧收藏起来哦~

【 tulaoshi.com - 服务器 】

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

   在计算机还没有出现之前,有一种叫做电传打字机(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显示文件的特殊符号:

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

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

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

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

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

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

  这时统计结果正确。

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

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

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

  由于第二行的换行符不是^M$格式,vim不会以dos文件格式来显示文件按,可以发现vim下方没有[dos]的提示了,表明vim以unix文件格式来显示这个文件,因此一些行的后面会多了一个^M标志。

  补充:sed对windows换行符的处理

  通过上面可以知道vim对于一个全部使用windows格式换行符的文本文件会以[dos]模式来显示这个文本,自动忽略行尾的^M.

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/fuwuqi/)

  博主在使用sed命令处理一些文件时,会出现一个本来显示正常的文件,被sed处理之后,再打开文件时发现再次出现讨厌的^M. 那么sed是如何处理windows换行符的文本呢?

  先在windows下创建一个文本文件,传至我的linux中。用cat -A 显示特殊字符:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/fuwuqi/)

  这里看到最后一行没有换行符,其他行的换行符为^M$, 使用sed处理这个文本文件,向第二行添加一些内容,再用cat -A查看:

  这里我用.*匹配第二行的所有内容,&表示匹配到的所有内容,在&后面我加上了一些内容,用cat -A查看发现,sed在处理替换时,如果匹配到整个行,那么匹配的内容是除了换行符$(Linux 换行符)外的所有内容,即使这个文本的换行符是^M$(windows 换行符).

  因此第二行的文本被sed处理后,^M被我的正则表达式.*当作文本内容而匹配到了,而$不会被匹配,永远在行的末尾充当换行符,这样一来^M和$就被拆散了。因此这一行的换行符在处理后成为了linux格式的换行符$. 用vim打开的效果如下:

  因为文件的换行符是linux和windows混杂的,vim以unix文件格式显示这个文件,文件的^M被显示出来,并且第二行的^M被sed匹配到,因而不在行尾。vim下方的[noeol]原因是最后一行在windows下没有换行符,因此也没有^M.

  得出结论:sed会把文件中的^M当作文件内容来处理,因此如果用sed处理windows下创建的文本文件,很有可能在处理之后显示时出现讨厌的^M. 关于其他的文本处理器如何处理windows的换行符,还有待进一步研究。

  小结:

  windows下创建的文件换行符为^M$,但最后一行结尾没有换行符

  linux下创建的文件,每一行都会以换行符$结束,包括最后一行

  vim打开文件时,如果文件的所有换行符都是dos格式的^M$,那么vim会自动以dos文件格式来显示文本文件,否则会以默认的unix格式显示文本,这是可能会在行的结尾出现^M的符号

  wc -l是以$换行符来统计行数的,因此windows下创建的文件使用wc -l统计行数时会少一行

  一个windows下创建的文件,在linux下显示正常,但是用某些文本处理命令,如sed处理后,文件的某些换行符可能会改变,造成显示不正常

  sed处理文件时,会把windows换行符中的^M当作文件内容,即sed只保留$作为行末尾的换行符,因此可能会造成换行符不一致。

来源:http://www.tulaoshi.com/n/20160331/2051551.html

延伸阅读
标签: 电脑入门
Windows 8和Windows 8新设备将于本月26日与全球消费者见面,不过,用户在购买这些设备或软件升级包之前,应充分了解Windows 8不同版本间的区别。数月前,微软宣布将为其即将上市的操作系统Windows 8推出3个消费级版本:Windows 8、Windows 8 Pro和Windows RT。 Windows 8和Windows 8 Pro之间区别不大,它们都拥有全功能开始屏幕和桌面环境,...
Linux 内核支持读写Fat、NTFS、Vfat、Fat32、Hfs 等文件系统(至少可以读),因此在 Linux 下访问 Windows 要比在 Windows 下访问 Linux 方面的多,不需要使用专门的软件,直接使用 Linux 命令即可。 Fat/Fat32分区时 Linux 访问 Windows 分区 Linux 将系统中所有的设备都看作文件,所以在 Linux 下访问 Windows 分区非常方便,只要使用 mo...
    在个人计算机上,Windos系统和Linux系统可以用来相互补充,在本文中我们将向你介绍如何在一台计算机上使用这两个系统,包括最好开始方式、有哪些文件可以使用等其他内容。 在刚刚过去的几年中,作为服务器和工作站操作系统的选择之一,Linux 已经很好的确定了自己的地位。 很多专业的用户发现,Linux...
  Linux可以与MS-DOS、OS/2、Windows等其他操作系统共存于同一台机器上。它们均为操作系统,具有一些共性,但是互相之间各有特色,有所区别。  目前运行在PC机上的操作系统主要有Microsoft的MS-DOS、Windows、Windows NT、IBM的OS/2等。早期的PC机用户普遍使用MS-DOS,因为这种操作系统对机器的硬件配置要求不高,而随...
标签: 服务器
Windows与Linux换行符差别所引起的问题的解决方法   windows和linux下的换行符是不同的。一般操作系统上的运行库会自动决定文本文件的换行格式. 如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在linux上运行就生成LF格式换行的文本文件. 在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编...

经验教程

999

收藏

12
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部