首先介紹最常使用的三種作業系統,他們的換行符號如下所示:
Linux: "\n"
Windows: "\r\n"
MAC: "\r" (MAC的部分可能尚需查證,作者是網路上找的資料,並未實際求證)
以下我們作個實驗,首先在Windows系統下編輯一個檔案名為windows.txt,而內容則輸入"aaa"接著換行再輸入"bbb",編輯完成後把此檔案傳到Ubuntu為作業系統的電腦底下。
另外在Ubuntu為環境的電腦下,用vim編輯一個內容相同的檔案,名為linux.txt。
Linux底下有個好用的指令叫作"od",他可以用來查閱非文字檔內容,在這裡我們用這個指令查閱檔案內容,並以ASCII方式印出內容。
指令用法為 "od -c 檔名"
下圖是用上面的命令對windows.txt與linux.txt印出的結果:
我們可以明顯的看到 第一個印出來的windows.txt內容,換行符號確實是"\r\n",而linux.txt的換行符號卻是"\n",另外linux下編輯的檔案,也自動在第二行"bbb"的最後面多加了一個"\n"(作者vim這個檔案時,當輸入完"bbb"並沒有再按Enter鍵)
因此windows編輯的檔案要拿到linux下處理的時候,必須要特別小心注意!!
=========================================================
另外下面是一個可以把檔案中的內容,一行一行印出的shell script名子叫Danny_test.sh:
FILE_NAME="./windows.txt"
echo "" >> $FILE_NAME
if [ -f "$FILE_NAME" ]; then
exec < $FILE_NAME
while read line
do
#line=`echo $line| sed 's/\r//g'`
line=`echo $line`
echo $line
done
fi
執行結果如下圖:
結果發現,只印出第一行aaa,bbb卻沒印,這裡有兩個原因:
1. 因為windows的換行符號\r\n跟linux的\n不同所造成
2. 因為windows下編輯的檔案結尾若沒有換行是不會加上\n的,linux下會自行加\n
接著分別解決方法
1. 使用sed 來將\r替換掉即可===> line=`echo $line| sed 's/\r//g'`
2. echo "" >> windows.txt ,這樣作檔案的後面就會加上\n了
因此Danny_test.sh可以這樣寫:
FILE_NAME="./windows.txt"
echo "" >> $FILE_NAME
if [ -f "$FILE_NAME" ]; then
exec < $FILE_NAME
while read line
do
line=`echo $line| sed 's/\r//g'`
echo $line
done
fi
執行結果: