当前所在位置: 首页 > 数码科技 > 正文

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

2023-10-19 本站作者 【 字体:

在计算机还没有出现之前,有一种叫做电传打字机(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的换行符$



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

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

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

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

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

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

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

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

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

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



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

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

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

因为文件的换行符是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只保留$作为行末尾的换行符,因此可能会造成换行符不一致。

阅读全文
相关推荐

太原市旅游攻略 太原最值得去的地方

太原市旅游攻略 太原最值得去的地方
太原经典1日游:太原第一站先游览山西省博物馆感受5000年的中华文明史,了解感受夏商踪迹、晋国霸业、佛风遗韵、明清晋商文化;然后可以去太原最大的的迎泽公园感受当地人民的生活气息,再去太原食品街寻找美食。

密云古北水镇旅游攻略 密云古北水镇一日游攻略

密云古北水镇旅游攻略 密云古北水镇一日游攻略
古北水镇位于密云东北侧,是一处在古村基础上改造重建的古镇景区。古镇依水而建,即有北方古镇的大气威严,也不失江南水乡的特色,可以泡温泉、品尝美食、爬司马台长城等,是京郊地区休闲度假不错的选择。古镇内不通车,非常适合步行游玩。

银川沙湖旅游攻略 银川沙湖几月份去最好

银川沙湖旅游攻略 银川沙湖几月份去最好
宁夏沙湖旅游景区地处贺兰山下、黄河金岸,20余平方公里沙漠与40余平方公里水域毗邻而居,拥有万亩水域、两千亩芦苇、千亩荷池、五千亩沙丘,这里栖居着白鹤、黑鹤、天鹅等十数种珍鸟奇禽,被誉为“世间少有”的文化旅游胜地。

黔东南旅游攻略 贵州黔东南旅游攻略自由行

黔东南旅游攻略 贵州黔东南旅游攻略自由行
黔东南苗族侗族自治州位于贵州省东南部,地处云贵高原东南边缘,东邻湖南,南接广西,境内居住着苗、侗、汉、布依、水等20多个民族,民族风情非常浓郁。这里有世界上最大的苗寨和最大的侗寨,有独特的吊脚楼、风雨桥、鼓楼。秋季是到黔东南旅行的最好时间,雨水不会像夏季般频繁,气温不会像冬季时寒冷,温度适宜。

青海湖旅游住宿攻略 青海湖环湖住宿攻略

青海湖旅游住宿攻略 青海湖环湖住宿攻略
由于青海湖距离西宁较远,所以建议在青海湖周边过夜,以便欣赏日出日落等美景。目前青海湖周边住宿的选择地方主要有以下几个:一、二郎剑景区附近:这里是青海湖唯一的官方景区,也是观看日出最佳的地点之一。这里有多家酒店和民宿可供选择,价格根据季节和设施不同而不同,旺季每晚约200-500元,淡季每晚约100-300元。

丽江大理洱海旅游攻略 丽江大理攻略最佳旅游攻略

丽江大理洱海旅游攻略 丽江大理攻略最佳旅游攻略
丽江古城一日游攻略:今日主要游览丽江古城,漫步在古城小巷,尽情享受古城慵懒的氛围,还可以在街头巷尾寻觅各式丽江特色小吃来填补肚子。之后前往狮子山,登上狮子山的制高点—万古楼,俯瞰整个丽江古城,运气足够好的话向北可以远眺到玉龙雪山。下了狮子山顺路去木府,近距离欣赏古城内这座仿紫禁城的纳西宫廷式建筑。傍晚回到古城,在四方街感受古城的夜生活,还可以去酒吧消遣一番,说不定会碰上美好的艳遇。古城西侧的狮子山公园是观赏古城全景的最佳去处,除了山顶的万古楼,公园有很多点都可以看到古城和雪山。

长春旅游攻略景点必去 长春市区旅游攻略必去景点

长春旅游攻略景点必去 长春市区旅游攻略必去景点
1、吉林省博物院:吉林省博物院,原名吉林省博物馆。吉林省博物院是一座历史与艺术博物馆,现有文物藏品12万余件,其中一级文物295件、二级文物3379件、三级文物14280件、其它文物近10万件,始自远古,及至现代,精华荟萃,内涵丰富。2、伪满皇宫博物院:伪满洲皇宫博物院建立在伪满皇宫旧址上,是末代皇帝爱新觉罗•溥仪充当伪满洲国傀儡皇帝时居住的宫殿,可见到御用汽车等文物。皇宫可分为进行政治活动的外廷和日常生活的内廷两部分,现分别辟为伪满皇宫陈列馆和伪满帝宫陈列馆,有缉熙楼、中和门、怀远楼、同德殿等建筑景观。

康定新都桥旅游攻略 新都桥必去的几个景点

康定新都桥旅游攻略 新都桥必去的几个景点
新都桥又称东俄罗,位于318国道川藏南北线的分叉路口,号称“摄影家的天堂”。在这可以拍摄到无垠的草甸,曲折的溪流,金黄的秋叶,山坡上大片在觅食的牛羊,散落着的藏族村寨,在金秋来临之际不失为赏秋的好去处,随便一按快门都能得出一张美丽的风景照。此外,国家地理推荐最佳欣赏蜀山之王——贡嘎山的观景点正是在新都桥,天气好可拍摄日照金山之景。

普陀山自驾旅游攻略 普陀山旅游自驾游攻略

普陀山自驾旅游攻略 普陀山旅游自驾游攻略
普陀山在浙江省舟山市普陀区,是舟山群岛1390个岛屿中的一个小岛,形似苍龙卧海,面积近13平方公里,与舟山群岛的沈家门隔海相望,素有“海天佛国”、“南海圣境”之称,是首批国家重点风景名胜区。

南昌旅游攻略景点必去 南昌必看的旅游点

南昌旅游攻略景点必去 南昌必看的旅游点
1、滕王阁:滕王阁临赣江而立,因王勃的《滕王阁序》而闻名,是“江南三大名楼”之一,也是南昌的地标。景区主要由滕王阁主阁,和南北两面的小园子组成,登楼望远是游人来此的主要目的。主阁从外面看是三层带回廊的建筑,其实它里面还有三个暗层和一个设备层,加上两层底座,一共有九层。2、八一广场:位于江西省南昌市的心脏,是江西政治、经济、文化、休闲、娱乐等活动的重要场所。由中心广场、主席台、东西二块游园组成,是江西省最大的城市中心广场。广场中心伫立着由元帅题写的“八一南昌起义纪念塔”,很多游客会在此合影。
本文Tag