用VIM替换掉文件内容里的“\r\n”

本文讲述了在Mac上使用VIM编辑器遇到Windows格式换行符的问题,以及如何通过VIM的二进制模式和替换功能删除.vimrc文件中的 换行符,确保文件正常识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值