unix 中的命令列工具大都需要直接或間接的操作檔案來完成工作。檔案格式會對工具的處理造成影響,有時甚至會得到非常奇怪的結果。
我在使用 awk 編寫解析指令碼來解析檔案時就遇到過這樣的問題。
當時一度懷疑是 awk 內部的 bug,最終卻發現原來是換行符的問題。
解析的原始檔使用了 windows 換行符,行結束字元\r\n中的\r會使 printf 的輸出變得相當奇怪。
查詢資料發現,\r是回車符,在 printf 函式的輸出中遇到乙個\r字元時,\r會導致之後的字元輸出位置重置到行首,這樣行首位置的舊值就會被替換,導致輸出異常。
有如下 awk 命令:
awk 'begin '
執行上面的命令會得到如下輸出:
testo world!首先處理 「hello world!」 ,遇到\r時 buffer 中的內容為 「hello world!」,處理回車符,後邊的字串 「test」 輸出到行首,覆蓋 「hell」 ,然後處理 「\n」 輸出 buffer 內容,這樣就得到了上面的結果。
備註:將檔案格式修改為unix格式,可以使用dos2unix命令。
回車符和換行符區別
首先介紹一下 回車 carriage return,r 和 換行 line feed,n 這兩個概念的來歷和區別。在計算機還沒有出現之前,有一種叫做電傳打字機 teletype model 33 的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個...
回車符和換行符區別
在計算機還沒有出現之前,有一種叫做電傳打字機 teletype model 33 的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。於是,研製人員想了個辦法解決這個問題,就是在每...
回車符和換行符區別
回車 carriage return,r 和 換行 line feed,n 這兩個概念的來歷在計算機還沒有出現之前,有一種叫做電傳打字機 teletype model 33 的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒...