2015年8月21日 星期五

在linux環境下,Windows與Linux檔案格式的差異性分析

    大家應該都有遇過這樣的問題,如果拿一個在windows環境下編輯的文字檔,拿到linux下作vim,在結尾的部分會出現^M的符號,其實這是因為windows以及linux換行符號不同所造成的。

首先介紹最常使用的三種作業系統,他們的換行符號如下所示:
       
      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

執行結果:


沒有留言:

張貼留言