1. 程式人生 > >linux文字與windows文字之間的轉換

linux文字與windows文字之間的轉換

本文轉載自小白

Linux與Windows文字格式之間的轉化

原理:

在Linux中,文字檔案用"\n"表示回車換行,而Windows用"\r\n"表示回車換行。所以在Linux中使用Windows的文字檔案常常會出現錯誤

因為裝了雙系統,所以有時一些檔案在兩個系統之間共享,不過之前一直沒有很在意這個問題.在windows系統中用Word或者Notepad++開啟檔案,在linux系統中一直用的是vim編輯器,不過昨天在命令列介面就只能用vi了..鬱悶!! 中文支援都是個頭痛的問題,在windows編輯過的文字檔案每行末尾都會以^M以結尾...

----------------------------------------------------

Linux提供了兩種文字格式相互轉化的命令:dos2unix和unix2dos,dos2unix把"\r\n"轉化成"\n",unix2dos把"\n"轉化成"\r\n"。

Ubuntu 7.10中預設沒有dos2unix或者unix2dos

提示要安裝tofrodos這個包( Converts DOS <-> Unix text files, alias tofromdos )

$sudo apt-get install tofrodos

dos2unix --> 將windows文字檔案轉化為linux格式

unix2dos --> 將linux文字檔案轉化為windows格式

用法:

man dos2unix

man unix2dos

----------------------------------------------------

使用linux系統中自帶的流文字編輯器sed

DOS/Windows和Linux/Unix的檔案換行回車格式不同基於 DOS/Windows 的文字檔案在每一行末尾有一個CR(回車)和LF(換行),而 UNIX 文字只有一個換行..

1. 把Dos/Windows下的檔案移至Linux/Unix系統

雖然很多程式不在乎 DOS/Windows 格式的 CR/LF 文字檔案,但是有幾個程式卻在乎 -- 最著名的是 bash,只要一遇到回車,它就會出問題。以下 sed 呼叫將把 DOS/Windows 格式的文字轉換成可信賴的 UNIX 格式:

$ sed -e 's/.$//' mydos.txt > myunix.txt

該指令碼的工作原理很簡單:替代規則表示式與一行的最末字元匹配,而該字元恰好就是回車。我們用空字元替換它,從而將其從輸出中徹底刪除。如果使用該指令碼並注意到已經刪除了輸出中每行的最末字元,那麼,您就指定了已經是 UNIX 格式的文字檔案。也就沒必要那樣做了!

2. 把Linux/UNIX 文字移至 Windows 系統,使用以下指令碼執行必需的格式轉換:

$ sed -e 's/$/\r/' myunix.txt > mydos.txt

在該指令碼中,'$' 規則表示式將與行的末尾匹配,而 '\r' 告訴 sed 在其之前插入一個回車。在換行之前插入回車,立即,每一行就以 CR/LF 結束。請注意,僅當使用 GNU sed 3.02.80 或以後的版本時,才會用 CR 替換 '\r'。

----------------------------------------------------

據說還可以用vim來處理(未測試):

在 Vim 的命令模式中輸入 :%s/^M$//g 後,回車即會自動刪除該檔案中的所有 ^M 字元

命令分析:

%指匹配整個檔案, s是置換的意思, ^M 注意要用Ctrl + V和Ctrl + M來輸入,M後面的$代表匹配行尾的內容(用空格替換), 最後的g則表示每行中匹配到的內容都要置換

----------------------------------------------------

使用tr 命令實現:

1. 使用類似於這樣的表示法: tr abc xyz  ,它表示用字母“x”去替換出現的所有字母“a”,用字母“y”去替換所有字母“b”,用字母“z”去替換所有字母“c”。

2. tr a-z A-Z 將用對應的大寫字母來替換所有的小寫字母(例如,它將“no smoking”轉換成“NO SMOKING”)。

3. 當您在 vi 編輯器中想強調正在編輯的文字的某一部分時,使用這一特殊技巧非常方便。只要按一下 Escape 鍵,然後按 : 鍵,再輸入 2,4!tr 'a-z' 'A-Z' ,最後按一下 Return 鍵。現在,從第 2 行到第 4 行的字母就都轉換成了大寫字母。

4. 另外,當有人給您傳送了一個在 Mac OS 或 DOS/Windows 機器上建立的文字檔案時,您會發現 tr 非常有用。如果沒有將檔案儲存為使用 UNIX 換行符來表示行結束這種格式,則需要將這樣的檔案轉換成本機 UNIX 格式,否則一些命令實用程式不會正確地處理這些檔案。Mac OS 的行尾以回車字元結束,許多文字處理工具將這樣的檔案作為一行來處理。為了糾正這個問題,可以用下列技巧:

   * Mac -> UNIX: tr '\r' '\n' < macfile > unixfile

   * UNIX -> Mac: tr '\n' '\r' < unixfile > macfile

----------------------------------------------------

Tips:
回車”(Carriage Return)和“換行”(Line Feed)這兩個概念的來歷和區別。
          在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33,Linux/Unix下的tty概念也來自於此)的玩意,每秒鐘可以打10個字元。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。

         於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。一個叫做“回車”,告訴打字機把列印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。

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

        Unix系統裡,每行結尾只有“<換行>”,即"\n";Windows系統裡面,每行結尾是“<換行><回車 >”,即“\n\r”;Mac系統裡,每行結尾是“<回車>”,即"\n";。一個直接後果是,Unix/Mac系統下的檔案在 Windows裡開啟的話,所有文字會變成一行;而Windows裡的檔案在Unix/Mac下開啟的話,在每行的結尾可能會多出一個^M符號。