^ v vs \ n在vim字符串替换中

在进行字符串替换( :s/x/y/ )时,Vim处理^M的方式似乎存在某种不对称。

也许一个例子是最好的; 说我们有这个文本文件:

foo:bar:biz

我想把它分成几行。 这工作正常:

:s/:/^M/g

(注意^M是通过输入Ctrl-VEnter

这导致文本文件:

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是一个可以方便地匹配任何类型“行尾”的“全部捕获”原子: CRLFCRLF

替换时, n<Nul>并表示为^@

替换时, r是当前fileformat的合法“行尾”。

总之,习惯这种模式并进行:

:s/n/r

请参阅:help NL-used-for-NulCR-used-for-NL

链接地址: http://www.djcxy.com/p/49341.html

上一篇: ^M vs \n in vim string replacement

下一篇: file to string and string to file in bash