• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

    首頁編程開發其它知識 → windows和linux、Mac系統換行規則的區別

    windows和linux、Mac系統換行規則的區別

    前往專題相關軟件相關文章發表評論 來源:西西整理時間:2014/5/26 22:05:50字體大?。?em class="fontsize">A-A+

    作者:西西點擊:262次評論:0次標簽: 換行

    LineDrop清除錯誤FTP傳輸換行符V2.0.0英文綠色免費版
    • 類型:編程輔助大?。?i>23KB語言:英文 評分:5.0
    • 標簽:
    立即下載

    在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失。

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

    這就是"換行"和"回車"的來歷,從它們的英語名字上也可以看出一二。

    后來,計算機發明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認為在每行結尾加兩個字符太浪費了,加一個就可以。于是,就出現了分歧。

    Unix系統里,每行結尾只有"<換行>",即"\n";Windows系統里面,每行結尾是"<回車><換行>",即"\r\n";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打開

    可以看到顯示結果正常,行的結尾并沒有^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.

    博主在使用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只保留$作為行末尾的換行符,因此可能會造成換行符不一致。

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

      • 8 喜歡喜歡
      • 3 頂
      • 1 難過難過
      • 5 囧
      • 3 圍觀圍觀
      • 2 無聊無聊

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)
      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>