[筆記] CRLF跟LF之區別 --- 隱形的 bug

最近在當助教時,偶然間遇到一個隱形的Bug
為什麼稱之為隱形呢?
請見下面兩張圖

說明:answer.txt 與 answer_test.txt 這兩個檔案的內容用文字編輯器打開時,完全一模一樣,但是我在使用 diff 指令的時候居然出現判定為每一行都不一樣的情形
指令 diff answer.txt answer_test.txt

由最上面第一張圖中可以注意到,answer.txt 的檔案大小是 958 byte
answer_test.txt 的檔案大小則為 924 byte
此時不禁讓我疑惑到,兩個檔案內容相同,空白數量也完全相同的情況下,造成檔案大小不同的原因是什麼呢?
下圖說明了一切
原來在 answer.txt 檔案當中,他的換行是採用 CRLF
而 answer_test.txt 的換行則是一般UNIX的情形 LF

# 以下感謝梁浩穎同學解釋

CRLF 就是 \r\n 是只有在 windows 系統在用的形式
所有的 UNIX 系統都是用 \n 
(的確,上圖中的 answer.txt 是用windows 7系統的記事本所編輯的,answer_test.txt 則是用 mac 系統透過 sublime text 所編輯的)

CR是carriage return的意思,也就是\r 
LF是line feed的意思,也就是\n
這就是為什麼有些檔案從unix系統拿去windows上面看 會變成全部都在同一行
因為只有LF 他不知道是換行
windows只吃CRLF
除了一些比較聰明的文字編輯器會分的出來

不過其實,CRLF才是真正的打字機運作方式,你可以想像:打字機打到最右邊,要先return到最左邊之後,再往下一行,所以是CRLF

如果想要清空 answer.txt 裡面所有的 \r 的話,可以使用以下指令

tr -d '\r’ answer.txt

# 遇到這個隱形的bug真是難得的好玩經驗,分享給大家 :)

留言

張貼留言

這個網誌中的熱門文章

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking