Windows檔案換行符轉Linux換行符
前段時間,有個朋友碰到由於Windows的換行符和Linux換行符不一樣,導致程式編譯不通過。這個問題之前自己也碰到過,網上資料也蠻多,不過還是藉此總結總結,因為發現總結+實踐的方式能夠讓自己更好的提升。
作業系統檔案換行符
首先介紹下,在ASCII中存在這樣兩個字元CR(編碼為13)和 LF(編碼為10),在程式設計中我們一般稱其分別為'\r'和'\n'。他們被用來作為換行標誌,但在不同系統中換行標誌又不一樣。下面是不同作業系統採用不同的換行符:
- Unix和類Unix(如Linux):換行符采用 \n
- Windows和MS-DOS:換行符采用 \r\n
- Mac OS X之前的系統
- Mac OS X:換行符采用 \n
Linux中檢視換行符
在Linux中檢視換行符的方法應該有很多種,這裡介紹兩種比較常用的方法。
第一種使用"cat -A [Filename]" 檢視,如下圖所示,看到的為一個Windows形式的換行符,\r對應符號^M,\n對應符號$.
第二種使用vi編輯器檢視,然後使用"set list"命令顯示特殊字元:
咦,細心的朋友發現了,怎麼^M還是沒顯示出來,這裡也是給大家提個醒,用VI的二進位制模式(“vi -b [FileName]”)開啟,才能夠顯示出^M:
Windows換行符轉換為Linux格式
下面介紹三種方法,選擇哪一種看自己喜好,當然你也可以選擇第x種,^_^。
(1)第一種使用VI: 使用VI普通模式開啟檔案,然後執行命令"set ff=unix" 則可以將Windows 換行符轉換為Linux換行符,簡單吧!命令中ff的全稱為file encoding。
(2)使用命令"dos2unix",如下所示
(3)使用sed命令刪除\r字元:[[email protected] test]# dos2unix gggggggg.txt dos2unix: converting file gggggggg.txt to UNIX format ...
[[email protected] test]# sed -i 's/\r//g' gggggggg.txt
多檔案處理換行符轉換
通常我們都會有一批檔案需要替換,比如一個目錄的都要替換,我自己寫了一個簡單的指令碼去遍歷目錄和子目錄下的所有檔案,並且將其轉換為Linux換行格式。程式碼如下:
#!/bin/sh
#CheckInput
#Check Whether the input is valid
#0 means not valid
CheckInput()
{
ret=1;
#Check the number of parameter
#And Check whether the argument is a folder
if [ $# -lt 1 ]
then
echo "Please use the command like ./dos2u.sh [Folder]";
ret=0
elif [ ! -d $1 ]
then
echo "Please use an invalid Folder as the shell argument";
ret=0
fi
return $ret;
}
#TraverseFolder
#Traser all the files under the folder
TraverseFolder()
{
oldPath=`pwd`
cd $1;
for file in `ls`
do
if [ -d $file ]
then
TraverseFolder $file;
else
#echo $file;
#sed -i 's/\r//g' $file
dos2unix $file
fi
done
cd $oldPath;
}
CheckInput $*
if [ $ret -ne 1 ]
then
exit -1
fi
TraverseFolder $1
這個就純當練習了,應該可以用更簡單的方式去解決,比如find命令+dos2unix命令,小夥伴們可以自己試一試。我這麼寫 主要目的是為了 以後有其他需求更便於擴充套件,當然還有一些bug要修改啦~~~~^_^。
參考
1. How To Convert Files from Linux/Unix Format to Windows and Vice Versa:
https://www.maketecheasier.com/convert-files-from-linux-format-windows/
2. Difference Between \n and \r?
http://stackoverflow.com/questions/1761051/difference-between-n-and-r
3. 美國資訊交換標準程式碼
http://baike.baidu.com/view/492542.htm