如何在 Linux 中刪除文本中的回車字元
「回車」字元可以往回追溯很長一段時間 —— 早在打字機上就有一個機械裝置或槓桿將承載紙滾筒的機架移到右邊,以便可以重新在左側輸入字母。他們在 Windows 上的文本文件上保留了它,但從未在 Linux 系統上使用過。當你嘗試在 Linux 上處理在 Windows 上創建的文件時,這種不兼容性有時會導致問題,但這是一個非常容易解決的問題。
如果你使用 od
( 八進位轉儲 )命令查看文件,那麼回車(也用 Ctrl+M
代表)字元將顯示為八進位的 15。字元 CRLF
通常用於表示 Windows 文本文件中的一行結束的回車符和換行符序列。那些注意看八進位轉儲的會看到 rn
。相比之下,Linux 文本僅以換行符結束。
這有一個 od
輸出的示例,高亮顯示了行中的 CRLF
字元,以及它的八進位。
$ od -bc testfile.txt
0000000 124 150 151 163 040 151 163 040 141 040 164 145 163 164 040 146
T h i s i s a t e s t f
0000020 151 154 145 040 146 162 157 155 040 127 151 156 144 157 167 163
i l e f r o m W i n d o w s
0000040 056 015 012 111 164 047 163 040 144 151 146 146 145 162 145 156 <==
. r n I t ' s d i f f e r e n <==
0000060 164 040 164 150 141 156 040 141 040 125 156 151 170 040 164 145
t t h a n a U n i x t e
0000100 170 164 040 146 151 154 145 015 012 167 157 165 154 144 040 142 <==
x t f i l e r n w o u l d b <==
雖然這些字元不是大問題,但是當你想要以某種方式解析文本,並且不希望就它們是否存在進行編碼時,這有時候會產生干擾。
3 種從文本中刪除回車符的方法
幸運的是,有幾種方法可以輕鬆刪除回車符。這有三個選擇:
dos2unix
你可能會在安裝時遇到麻煩,但 dos2unix
可能是將 Windows 文本轉換為 Unix/Linux 文本的最簡單方法。一個命令帶上一個參數就行了。不需要第二個文件名。該文件會被直接更改。
$ dos2unix testfile.txt
dos2unix: converting file testfile.txt to Unix format...
你應該會發現文件長度減少,具體取決於它包含的行數。包含 100 行的文件可能會縮小 99 個字元,因為只有最後一行不會以 CRLF
字元結尾。
之前:
-rw-rw-r-- 1 shs shs 121 Sep 14 19:11 testfile.txt
之後:
-rw-rw-r-- 1 shs shs 118 Sep 14 19:12 testfile.txt
如果你需要轉換大量文件,不用每次修復一個。相反,將它們全部放在一個目錄中並運行如下命令:
$ find . -type f -exec dos2unix {} ;
在此命令中,我們使用 find
查找常規文件,然後運行 dos2unix
命令一次轉換一個。命令中的 {}
將被替換為文件名。運行時,你應該處於包含文件的目錄中。此命令可能會損壞其他類型的文件,例如除了文本文件外在上下文中包含八進位 15 的文件(如,鏡像文件中的位元組)。
sed
你還可以使用流編輯器 sed
來刪除回車符。但是,你必須提供第二個文件名。以下是例子:
$ sed -e 「s/^M//」 before.txt > after.txt
一件需要注意的重要的事情是,請不要輸入你看到的字元。你必須按下 Ctrl+V
後跟 Ctrl+M
來輸入 ^M
。s
是替換命令。斜杠將我們要查找的文本(Ctrl + M
)和要替換的文本(這裡為空)分開。
vi
你甚至可以使用 vi
刪除回車符(Ctrl+M
),但這裡假設你沒有打開數百個文件,或許也在做一些其他的修改。你可以鍵入 :
進入命令行,然後輸入下面的字元串。與 sed
一樣,命令中 ^M
需要通過 Ctrl+V
輸入 ^
,然後 Ctrl+M
插入 M
。%s
是替換操作,斜杠再次將我們要刪除的字元和我們想要替換它的文本(空)分開。 g
(全局)意味在所有行上執行。
:%s/^M//g
總結
dos2unix
命令可能是最容易記住的,也是從文本中刪除回車的最可靠的方法。其他選擇使用起來有點困難,但它們提供相同的基本功能。
作者:Sandra Henry-Stocker 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive