以前還真沒注意回車和換行有啥區別,直到。。。
那天我在windows下使用notepad
下編輯一個小文本,用notepad
的替換工具替換每一行的回車(大概是這個目的),我當時是用正則匹配的,結果用\r
或\n
怎么都匹配不到我要的結果,心里非常疑惑,檢查正則的其他部分,沒問題啊。隨后網上查了下,發現\r
回車和\n
換行是歷史遺留問題,在三個主流系統里都不一樣,在正則里也就不一樣了,具體由來是這樣的:
關于“回車”(carriage return)和“換行”(line feed)這兩個概念的來歷和區別。在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失。
??于是,研制人員想了個辦法解決這個問題,就是在每行后面加兩個表示結束的字符。一個叫做“回車”,告訴打字機把打印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。
??后來,計算機發明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認為在每行結尾加兩個字符太浪費了,加一個就可以。于是,就出現了分歧。
??Unix 系統里,每行結尾只有“<換行>”,即“\n”;Windows系統里面,每行結尾是“ <回車><換 行>”,即“\r\n”;Mac系統里,每行結尾是“<回車>”,即“\r”。
??一個直接后果是,Unix/Mac系統下的文件在Windows里打開的話,所有文字會變成一行;而Windows里的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。
下面我在windows里的notepad上舉個例子:
下圖是我要編輯的文件內容:
我想在以"setosa"結尾的行后面再復制上一行的內容,預期結果是這樣的:
我先使用正則為(^.*setosa\r)
進行匹配替換,也就是只用\r
匹配回車,\1\1
表示重復匹配到的結果。
結果如下:
嘿,好像匹配替換成功了啊,別急著高興,你用記事本打開看看:
記事本結果顯示復制是復制了,就是沒換行。這是由于匹配到\r
后直接復制本行的內容,并將本行的\n
頂到了最后面,所以只在復制完后換行一次。
我們接著使用\n
的正則(^.*setosa\n)
進行匹配:
結果發現根本匹配不到,因為"setosa"后面還有個\r
,匹配不到\r所以直接報錯了:
在windows下的notepad中達到上述要求的正確的匹配正則應該是:(^.setosa\r\n)*:
這次替換后我們再用記事本打開:
這次的結果是正確的,并且用txt打開也是正常的。
在不同系統下匹配換行時一定要注意上述問題,并且上面演示的僅是在windows中進行匹配的過程和結果,如果在Unix和Linux中,應該將
\r\n
換為\n
,Mac中應該換為\r
。
更多原創精彩視頻敬請關注生信雜談: