windows 回車符對 printf 函式的影響

2021-09-22 02:24:24 字數 756 閱讀 1116

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秒...