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

南柯一梦1115

南柯一梦1115

2016-03-31 15:57

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

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

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

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

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

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

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

  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行,少了一行,原因是文件的最后一行没有换行符。

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

  我在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.

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

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

  这里看到最后一行没有换行符,其他行的换行符为^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只保留$作为行末尾的换行符,因此可能会造成换行符不一致。

展开更多 50%)
分享

猜你喜欢

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

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

了解windows和LINUX的区别

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
了解windows和LINUX的区别

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

MAC系统PKG文件和DMG文件有哪些区别?

电脑入门
MAC系统PKG文件和DMG文件有哪些区别?

Windows系统的待机、休眠、睡眠的区别和优缺点

电脑入门
Windows系统的待机、休眠、睡眠的区别和优缺点

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Mac怎么删除双系统中的windows系统

Mac系统
Mac怎么删除双系统中的windows系统

linux系统上挂载windows分区和U盘的方法

电脑入门
linux系统上挂载windows分区和U盘的方法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

选购服务器考察的主要指标有哪些?

选购服务器考察的主要指标有哪些?

怎么删除360浏览器保存的密码

怎么删除360浏览器保存的密码
下拉加载更多内容 ↓