Windows & Linux 文件格式之迷 < VI下刪除文本中的^M>

關於回車與換行
很久以前,老式的電傳打字機使用兩個字符來另起新行。一個字符把滑動架移回首位 (稱爲回車,ASCII碼爲0D),另一個字符把紙上移一行 (稱爲換行,ASCII碼爲0A)。當計算機問世以後,存儲器曾經非常昂貴。有些人就認定沒必要用兩個字符來表示行尾。UNIX 開發者決定他們可以用一個字符來表示行尾,Linux沿襲Unix,也是。Apple 開發者規定了用.開發 MS-DOS以及Windows 的那些傢伙則決定沿用老式的.
三種行尾格式如下:
unix : n
dos : rn
mac : r
這意味着,如果你試圖把一個文件從一種系統移到另一種系統,那麼你就有換行符方面的麻煩。
因爲MS-DOS及Windows是回車+換行來表示換行,因此在Linux下用Vim查看在Windows下寫的代碼,行尾後“^M”符號。 www.2cto.com
在Vim中解決這個問題,很簡單,在Vim中利用替換功能就可以將“^M”都刪掉,鍵入如下替換命令行:
:%s/^M//g
注意:
上述命令行中的“^M”符,不是“^”再加上“M”,而是由“Ctrl+v”、“Ctrl+M”鍵生成的,或者Ctrl+v,再按回車。
或者使用這個命令:
:% s/r//g

(1)問題提出
我們可能會遇到過這樣一些困惑:
A, 如何查看一個文件或數據流的二進制格式(以十六進制格式顯示)?
B,爲什麼在 windows下編輯的 shell 腳本在 Unix下不能執行?爲什麼在 windows下編輯的 C 源文件在有些 gcc 編譯器下不能編譯?
C,爲什麼我在 vi 等編輯器下打開一個文本文件會包含 ^M,如何把它去掉?爲什麼我在 windows 上用記事本打開 unix上的文件,文件都不換行?

(2)分析與方案

A,如何查看一個文件的二進制格式(以十六進制格式顯示)?
方法一:在 UtraEdit 使用 Ctrl + H 切換到十六進制編輯模式。** 注意 ** :此方法一有缺陷,它會將行末的單個"換行符"顯示成 "回車" + "換行" 兩個字符。

方法二:使用文件或流的二進制查看工具 fbin。

B,爲什麼在 windows下編輯的 shell 腳本在 Unix下不能執行?爲什麼在 windows下編輯的 C 源文件在有些 gcc 編譯器下不能編譯?

原因分析:unix 的 shell 腳本不能識別 "回車符" (即:CR,'r'),Windows 文件格式換行時,總是以 "回車" + "換行" ,導致 unix 下的 shell 無法正常解釋。解決方法:就是把 windows 格式的中的 "回車" 符刪除。

方法一:使用 vi 打開源文件,把 'rn' 替換成 'n' ;** 缺點 ** :不適合大量文件的批量作業。

方法二:使用 UtraEdit 把 Windows 格式的文件轉換成 Unix 格式。文件-->轉換-->Unix轉DOS;** 缺點 ** :不適合大量文件的批量作業。

方法三:Unix 下的 dos2unix 命令,如 $ dos2unix -k xx.c;** 缺點 ** :此方法有一致命缺陷,它會改變原來的文件屬性,如一個可執行 shell 腳本的可執行屬性及其它屬性,轉換後都將會丟掉;** 優點 ** :適合大量普通文件本文件的批量作業。

方法四: win2unix (windows,unix 均可使用),功能類似 dos2unix,如 win2unx xx.c;** 優點** :克服了 dos2unix 的所有缺點,它能保留源文件的任何屬性。還適合大量文件的批量作業。

C,爲什麼我在vi 等編器下打開一個文本文件會包含^M,如何把它去掉? 爲什麼我在windows上用記事本打開unix上的文件,文件都不換行?

原因分析:要解決這個問題,必先弄清 unix 與 windows 文本文件的差異。如下:
1) 磁盤中 Windows 文本文件總是以 "回車" + "換行"的形式進行換行的。
2) 磁盤中 Unix 格式的文本文件,總是以"換行符"(即:LF,'n') 換行,而非 "回車換行符"。(Unix 規定:unix 文本文件保存到磁盤時,總是自動把 "回車換行符" 轉換成 "回車符" 保存,輸出到終端時由終端自動將將 "回車符" 轉換成 "回車換行符" 輸出)

** 結論 1 **:這樣在 windows 的記事本中打開 Unix 格式的文件時,因爲文件中沒有 'r',所以無法正常顯示換行,結果就會把所有的內容顯示在同一行中。

** 結論 2 **:UtraEdit 等工具會自動檢測文件中是否包含'r',當檢查行末缺少'r'時,一般它會提示要求進行Unix 到Windows 格式的轉換(相信都遇到這個提示信息)。

** 結論 3 **:UtraEdit 和 vi 等工具,在保存文件時會自動依照文件原來的格式進行保存。即:如打開的如是 windows 格式它會把文件依然按 windows 格式保存(不進行自動轉換);如打開的如是unix 格式它會把文件依然按 unix 格式保存(不進行自動轉換)。

Linux編輯器vim中刪除行尾的^M有時候,在Linux中使用打開曾在Windows中編輯過的文件時,會在行尾看到^M字符。看起來總是感覺很彆扭。刪除方法如下:在Vim的命令模式中輸入:%s/^M$//g後,回車即會自動刪除該文件中的所有^M字符。注意:^M要用Ctrl+v, Ctrl+m來輸入,M後面的$代表匹配行尾的內容,最後的g則表示每行中匹配到的內容都要置換。


可以用以下方法快速的解決:

 

方法1:
在命令模式下:輸入:%s/^M//g 然後,回車即可替換

注,其中"^M"的輸入,分別是“Ctrl+v”、“Ctrl+M”鍵生成的

 

方法2: 

使用vi打開文本文件
    vi dos.txt
    命令模式下輸入
    :set fileformat=unix
    :w

方法3:

使用sed 工具
    sed ’s/^M//’ filename > tmp_filename

方法4:

既然window下的回車符多了‘\r’,那麼當然通過刪除‘\r’ ,也可以實現:
    tr -d '\r'

方法5:(最常用的方法)

    在終端下敲命令:
    $ dos2unix filename
    直接轉換成unix格式,就OK了!~


 

補充:

將Windows中的文本文件傳到Linux後,會在每行的末尾多出一個^M符號。當進行Shell編程時,該符號可能會導致正則表達式匹配失敗。如果想 去掉這個符號可以使用dos2unix命令。當然如果想恢復爲Windows下的模式可以使用unix2dos命令。   當從Windows傳來一個文件時,可以使用vim -b 命令來打開該文件,這樣就能看到行尾的^M符號了,否則是看不到的。

 


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