^ v vs \ n在vim字符串替换中
在进行字符串替换( :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
之间存在这种不对称,取决于它是在字符串替换命令的右侧还是左侧?
在搜索时, n
是一个可以方便地匹配任何类型“行尾”的“全部捕获”原子: CRLF
, CR
和LF
。
替换时, n
是<Nul>
并表示为^@
。
替换时, r
是当前fileformat
的合法“行尾”。
总之,习惯这种模式并进行:
:s/n/r
请参阅:help NL-used-for-Nul
和CR-used-for-NL
。