【发布时间】:2017-06-03 06:54:07
【问题描述】:
在进行字符串替换 (:s/x/y/) 时,Vim 对待 ^M 的方式似乎有些不对称。
也许最好举个例子;假设我们有这个文本文件:
foo:bar:biz
我想把它分成几行。这工作正常:
:s/:/^M/g
(注意^M是通过输入Ctrl-V,Enter产生的)
这会产生文本文件:
foo
bar
baz
现在,如果我撤消该操作并重试,我注意到这 不起作用:
:s/:/\n/g
这里,结果文本是:
foo^@bar^@biz
也就是说,它们是由 ASCII NUL 字节(0x00)连接起来的。
问题1:为什么在替换中使用\n会导致NUL字节?
现在,我想“好吧,我猜 ^M 以某种方式用作 Vim 的‘行分隔符’字符;我可以使用它”。
所以我做了另一个实验,从每行一项的文本文件开始:
foo
bar
baz
现在,我想用冒号加入它们,所以它看起来像上面的第一个化身。
所以我跑了:
:%s/^M/:/
但这失败了,出现错误:
E486: Pattern not found: ^M
但是,这个命令确实有效:
:%s/\n/:/
制作:
foo:bar:biz:
(我可以自己去掉尾随的冒号)
所以问题 2:为什么 \n 在这种情况下可以工作,而 ^M 却不行?
最后,问题 3:为什么 \n 和 ^M 之间存在这种不对称,这取决于它是在字符串替换命令的右侧还是左侧? p>
【问题讨论】: