用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/

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