1. 程式人生 > >vim 開啟檔案末尾帶有^M的解決辦法

vim 開啟檔案末尾帶有^M的解決辦法

轉載地址:https://blog.csdn.net/laoding1993/article/details/50722029

一、背景 
昨天寫了一個expect指令碼用來做 板卡的自動化測試,獲取framer裝置的link up/down資訊 定向到log檔案裡面。為了方便分析和處理,使用shell 指令碼處理這個log文字。 
主要思路是將log中的特定行輸出至新的new_log檔案,對new_log檔案中的詞語進行拆分、比較,對裝置link up/down 的狀態資訊進行統計。 
初步寫了一個shell指令碼後,發現對裝置的統計資訊明顯不對。為了測試程式,偽造了一個log文字,就是自己複製貼上的資料;處理之後,發現統計資訊沒什麼問題。。繼續對原始檔進行處理,還是有問題。百思不得其解。。。。 
二:發現問題 
經過偽造的log與new_log的對比分析發現,new_log文本里每行的末尾多了一個^M;利用shell鞋的分詞程式發現,這個^M竟然與末尾單詞是一個整體,怪不得統計資訊有問題;單純比較字串的話,肯定是有問題的; 
vim開啟 new_log 的顯示如下:

     CPU Normal^M
     Framer Host Link Up^M
     CPU Normal^M
     Framer Host Link Down^M
1
2
3
4
分詞log如下:

CPU 
Normal^M 
Framer 
Host 
Link 
Up^M

三、解決問題 
發現這個問題之後,就得想辦法去除^M 以及找到^M出現的原因; 
經過百度,發現:

1. 在windows下的文字檔案的每一行結尾,都有一個回車('\n')和換行('\r')
2. 在linux下的文字檔案的每一行結尾,只有一個回車('\n');
3. 在Mac下的文字檔案的每一行結尾,只有一個換行('\r');
1
2
3
而在linux下開啟windows編輯過的檔案,就會在行末尾顯示^M; 
這個^M的在vim下的輸入是:

ctrl+v <----> ^
ctrl+m <----> M
1
2
四:解決方法 
1:首先想到的字串的替換 
利用VIM的命令列輸入:

%s/^M$//g
1
解釋:% 指匹配整個檔案,s 是置換的意思,^M 注意要用 Ctrl + V Ctrl + M 來輸入,M 後面的 $ 代表匹配行尾的內容,最後的 g 則表示每行中匹配到的內容都要置換; 
2:dos2unix工具

dos2unix Filename
1
3:批量轉換

find ./ -type f -print0 | xargs -0 dos2unix
1
或者

find ./ -type f print0 | xargs -0 sed -i 's/^M$//'
1
即可。