用VIM替換掉文件內容裏的“\r\n”

公司的 Mac OSX 虛擬機有兩個珍貴的文件:

  • .bash_profile 顧名思義,這是bash的配置文件,每次打開Terminal時都會調用。該配置文件裏有相當多便捷的命令、快捷方式。
  • .vimrc 這是VIM的配置文件,裏面是我最喜歡的VIM佈局。

我把兩個文件複製到家裏的Mac Book Pro,沒想到出錯了:

原來,筆記本的VIM無法識別.vimrc裏的某個字符:\r (回車,0x0D)。

該文件裏所有的換行都是Windows格式:\r\n(0x0D 0x0A);Mac只識別\n(0x0A),而把\r識別爲“不可打印字符”(non-printable char)了。

可實際上,我虛擬機的源文件都用得好好的,怎麼用郵件發到家裏,就變成Windows的換行了?

我猜很可能是163郵箱悄悄做了壞事。以後再發送附件,我還是先壓縮一下吧。


現在要做的,就是用VIM編輯器刪掉.vimrc所有的\r。

注意:打開文件時必須用-b參數(binary mode)如:vim -b .vimrc,否則,VIM默認不顯示“non-printable char”,你會以爲文件沒毛病。使用二進制模式後,\r顯示成^M,如下圖:


看到了吧,每一行的結尾都有一個^M。如果想知道它是什麼字符,在VIM裏用下面命令開啓“不可顯示字符-十六進制”模式。

:set display=uhex 或者:set dy=uhex

結果如下圖:


最後,用vim的替換功能,刪掉所有的^M,反正VIM認爲它們都是無意義的non-printable char。(\n沒有顯示成十六進制,說明它對vim是有意義的non-printable char)

:%s/\r//g

---------------------------------------------------------------------------------------

% 加上這個,表示操作全文的“每一行”。(默認只操作當前一行)

s  替換命令:substitute

/\r 替換源是\r

/    替換爲“空”

/g  整行所有的匹配都要替換。(默認只替換第一處)


注:

:set dy= 把display附加模式設置爲默認的“無”。

:set dy   顯示當前所有的display附加模式。

:%!xxd  把VIM變成“十六進制編輯器”。可編輯每個字符。(無效區域的編輯都忽略,比如“ASCII顯示區”)

:%!xxd -r 把VIM變回一般的文本編輯器。


注2,vim替換s的完整語法:

: [range] s / src / dst [/ gic]

range: 作用範圍

% 整個文件
. 當前行(默認,所以可忽略)
$ 最後一行
n1,n2 從 n1 行到 n2 行


/gic
/g 替換該行的文本里所有的匹配(默認只替換第一次匹配)
/i 忽略大小寫
/c 每次替換前需要用戶確認(confirm)


用例:

:s/vivian/sky/ 替換當前行第一個 vivian 爲 sky
:s/vivian/sky/g 替換當前行所有 vivian 爲 sky
:n,$s/vivian/sky/g 替換第 n 行開始到最後一行中每一行所有 vivian 爲 sky
:s#vivian/#sky/# 可以使用 # 作爲分隔符,此時中間出現的 / 不會作爲分隔符。
替換當前行第一個 vivian/ 爲 sky/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章