關於回車(\r)和換行(\n)的起源,大意是過去的打字機為了提高打字效率,在每一行的末尾會加上回車和換行兩個字元。回車的意思是將打字頭回退到當前行的首部,而換行則是新起一行進行列印。比如,現在要列印下面這兩行,aline1和bline2。首先打字機打完aline1後,此時打字頭停留在"1"的這個位置。這時,先進行回車操作,那麼打字頭會回退到"a"的這個位置。然後,再進行換行操作,打字頭放到了下一行,之後再列印bline2。從這個過程可見,咱們認為簡單的換行列印,實際上在過去打字機是分兩個步驟完成的。試想,如果只有回車,沒有換行,那麼打字頭只能在第一行來回掃動,新的行會覆蓋掉舊的行;如果只有換行,沒有回車,雖然打出來的字不會被覆蓋掉,但是打字頭將會一往直前地向前移動(前提是打字頭真的有那麼多活動空間),打出來的段落將會形成乙個下降的台階狀(自行腦補)。
aline1
bline2
後來計算機問世後,由於儲存裝置造價問題,有些科學家認為回車換行就用乙個字元表示足矣。當然,這說的是有些,自然不是統一意見。個人認為,回車和換行糾結的問題,主要體現在每一行的行末結束符表示上。linux採用的\n作為行末結束符,windows採用\r\n作為行末結束符。雖然linux的換行\n可以直接將游標移動到下一行的首部,但是回車\r實際上也同樣被保留了下來。舉個例子:
輸入:echo "line1\rline2" > test.txt ; cat test.txt
輸出:line2
單從輸出結果看,由於回車的作用,\r後面的line2覆蓋掉了line1。但實際上,這只是列印時覆蓋掉的,line1仍然儲存在test.txt檔案中。
輸入:cat -a test.txt
輸出:line1^mline2$
cat -a [filename] 命令會將檔案內的全部隱藏字元列印出來,^m指的是回車\r,$指的是換行\n。這說明,line1仍然在test.txt檔案中健在,只是列印時被line2覆蓋掉了而已。
關於linux下,\n作為行末結束符的問題,還有一點要說明。就是當寫入檔案時,不管你有沒有輸入這個\n,linux都會自動幫你補上這個\n的。
輸入:echo "line" > test.txt ; cat -a test.txt
輸出:line$
其實這就帶來乙個問題,在windows下寫入檔案時,在檔案的末尾,不會給你補上任何東西的(任何東西包括\r\n),所以當把windows下的檔案放到linux下用cat命令開啟時,由於最後一行沒有\n結束符,導致最後一行的行末在列印時有個奇怪的"%"。比如,在windows下用記事本寫入如下:
windows line1
windows line2
寫好後儲存為test.txt,拷到linux下的某個目錄下,用cat -a test.txt 開啟,顯示如下:
其實,那個"%"並不是檔案中的字元,由於當前test.txt的最後一行沒有\n作為行末結束符,所以才有乙個"%"報錯的提示。驗證它很簡單,只需要將"windows line2"替換為"windows line2\n"即可,也就是人工新增個\n。這裡可以用sed命令:sed -i "s/line2/line2\n/g" test.txt ; cat -a test.txt。輸出為:
這樣就沒有那個"%"報錯了。也順便看一下截圖中的那個^m,這個對應的是\r。所以,這個圖也驗證了,windows是用\r\n作為行末結束符的。
最近的一些事情
離上次寫部落格已經半個月了,其實中間也想寫過,但是真的有點太累了,每天眼睛都很酸,我已經很注意睡眠,保證八個小時 了,但是每天九點多到家還是累的啥也不想幹。分開說把 工作 最近幹的還不錯的感覺,比較適應,工作進入一種平穩狀態了,沒有什麼特別難的點了,各種工具已經比較熟悉了,然後今天還給北京方面教導了...
回車和換行的區別
在計算機還沒有出現之前,有一種叫做電傳打字機 teletype model 33 的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。於是,研製人員想了個辦法解決這個問題,就是在每...
回車和換行的區別
符號 ascii碼 意義 n 10 換行nl r 13 回車cr 回車 r 本義是游標重新回到本行開頭,r的英文return,控制字元可以寫成cr,即carriage return 換行 n 本義是游標往下一行 不一定到下一行行首 n的英文newline,控制字元可以寫成lf,即line feed ...