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符號。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章