技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費(fèi)軟件下載基地!

當(dāng)前位置:主頁(yè) > 教程 > 服務(wù)器類(lèi) >

windows和linux、Mac系統(tǒng)換行規(guī)則的區(qū)別

來(lái)源:技術(shù)員聯(lián)盟┆發(fā)布時(shí)間:2018-07-17 06:07┆點(diǎn)擊:

  在計(jì)算機(jī)還沒(méi)有出現(xiàn)之前,有一種叫做電傳打字機(jī)(Teletype Model 33)的玩意,每秒鐘可以打10個(gè)字符。但是它有一個(gè)問(wèn)題,就是打完一行換行的時(shí)候,要用去0.2秒,正好可以打兩個(gè)字符。要是在這0.2秒里面,又有新的字符傳過(guò)來(lái),那么這個(gè)字符將丟失。

  于是,研制人員想了個(gè)辦法解決這個(gè)問(wèn)題,就是在每行后面加兩個(gè)表示結(jié)束的字符。一個(gè)叫做"回車(chē)",告訴打字機(jī)把打印頭定位在左邊界;另一個(gè)叫做"換行",告訴打字機(jī)把紙向下移一行。

  這就是"換行"和"回車(chē)"的來(lái)歷,從它們的英語(yǔ)名字上也可以看出一二。

  后來(lái),計(jì)算機(jī)發(fā)明了,這兩個(gè)概念也就被般到了計(jì)算機(jī)上。那時(shí),存儲(chǔ)器很貴,一些科學(xué)家認(rèn)為在每行結(jié)尾加兩個(gè)字符太浪費(fèi)了,加一個(gè)就可以。于是,就出現(xiàn)了分歧。

  Unix系統(tǒng)里,每行結(jié)尾只有"<換行>",即"n";Windows系統(tǒng)里面,每行結(jié)尾是"<回車(chē)><換行>",即"rn";Mac系統(tǒng)里,每行結(jié)尾是"<回車(chē)>"。一個(gè)直接后果是,Unix/Mac系統(tǒng)下的文件在Windows里打開(kāi)的話,所有文字會(huì)變成一行;而Windows里的文件在Unix/Mac下打開(kāi)的話,在每行的結(jié)尾可能會(huì)多出一個(gè)^M符號(hào)。

  因此在linux下創(chuàng)建的文本文件在windows中會(huì)連成一行,因?yàn)閣indows認(rèn)為沒(méi)有換行符(CRLF)。

  在windows下創(chuàng)建的文本文件在linux中可能會(huì)出現(xiàn)每一行后面多了一個(gè)^M,這個(gè)^M要用ctrl + v ctrl + m打出,代表的意思就是CR(Carriage Return).

  說(shuō)到這里有人也許會(huì)問(wèn),為什么我在windows下創(chuàng)建的文本文件,在linux中顯示正常呢?

  例如,我在windows下創(chuàng)建一個(gè)文本文件a.txt,放到我的linux中,用vim打開(kāi)

windows和linux、Mac系統(tǒng)換行規(guī)則的區(qū)別 三聯(lián)

  可以看到顯示結(jié)果正常,行的結(jié)尾并沒(méi)有^M符號(hào)。這是因?yàn)関im在打開(kāi)文件時(shí),會(huì)自動(dòng)檢測(cè)換行符,如果文本的所有換行符都是^M$(CRLF, 即windows的換行標(biāo)記),那么vim會(huì)自動(dòng)以dos格式顯示文本內(nèi)容,忽略掉每一行結(jié)尾的^M$,因此文本顯示是正常的。

  注意上面我圖片的兩個(gè)箭頭指示的vim編輯器最下方的兩個(gè)標(biāo)志[noeol]和[dos],先來(lái)解釋第二個(gè)標(biāo)志"[dos]",這表示vim識(shí)別到文本的每一行都是^M$的換行符,因此vim自動(dòng)以dos文本格式來(lái)顯示文件。所以我們看到文本顯示是正常的。

  那么為什么有的時(shí)候windows下創(chuàng)建或編輯的文件在linux下會(huì)出現(xiàn)^M呢,vim不是能自動(dòng)識(shí)別嗎?這是因?yàn)椋瑅im會(huì)檢查文本的每一行換行符,只要有一行的換行符不是windows格式,那么vim就會(huì)以u(píng)nix文件格式來(lái)顯示文件,這時(shí)換行符為$, 因此我們會(huì)看到文本的行后面多了一個(gè)^M符號(hào)。

  這里我用cat -A顯示文件的特殊符號(hào):

windows和linux、Mac系統(tǒng)換行規(guī)則的區(qū)別

  文件一共四行,可以看換行符都是^M$(箭頭所指),因此vim會(huì)用[dos]文件格式來(lái)顯示這個(gè)文本。

  這里還可以發(fā)現(xiàn)文件的最后一行沒(méi)有換行符,這就是第一張圖vim中的[noeol]標(biāo)志的由來(lái) ,因?yàn)樵趙indows下處理的文本,最后一行是不會(huì)加上換行符的,而linux下創(chuàng)建的文本的規(guī)則是每一行都有換行符,包括最后一行。因此vim會(huì)提示no end-of-line, 告訴我們這個(gè)文件包含沒(méi)有換行符結(jié)束的行。

  用wc -l統(tǒng)計(jì)這個(gè)文件的行數(shù):

windows和linux、Mac系統(tǒng)換行規(guī)則的區(qū)別

  結(jié)果是3行,少了一行,原因是文件的最后一行沒(méi)有換行符。

  我在linux下用vim編輯一個(gè)新文件,內(nèi)容和剛剛的a.txt一樣,用cat -A查看:

windows和linux、Mac系統(tǒng)換行規(guī)則的區(qū)別

  可以看到linux下創(chuàng)建的文本,每一行都是有換行符的,包括最后一行,用wc -l統(tǒng)計(jì)行數(shù):

windows和linux、Mac系統(tǒng)換行規(guī)則的區(qū)別

  這時(shí)統(tǒng)計(jì)結(jié)果正確。

  再用sed替換windows下創(chuàng)建的a.txt, 將其中一行的換行符^M$中的^M去掉,變成linux的換行符$

windows和linux、Mac系統(tǒng)換行規(guī)則的區(qū)別

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

  在命令行中不是直接輸入,而是 ctrl+v和ctrl+m. 再用vim打開(kāi)這個(gè)文件:

windows和linux、Mac系統(tǒng)換行規(guī)則的區(qū)別