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