公司的 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 行 |
/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/ |