Windows & Unix 檔案格式之迷 < VI下刪除文字中的^M>

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

(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 格式。檔案--&gt轉換--&gtUnix轉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 格式儲存(不進行自動轉換)。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/66634/viewspace-1058243/,如需轉載,請註明出處,否則將追究法律責任。

相關文章