^M vs \n in vim string replacement

There seems to be some sort of asymmetry in the way Vim treats ^M when doing string replacement ( :s/x/y/ ).

Perhaps an example is best; say we have this text file:

foo:bar:biz

I want to split this into lines. This works fine:

:s/:/^M/g

(note that ^M is produced by typing Ctrl-V , Enter )

This results in the text file:

foo
bar
baz

Now, if I undo that and try again, I notice that this does not work:

:s/:/n/g

Here, the resulting text is:

foo^@bar^@biz

That is to say, they are joined by the ASCII NUL byte ( 0x00 ).

Question 1: Why does using n in the replacement result in NUL bytes?

Now, I figure "okay, I guess ^M is used as the 'line separator' character in some way, for Vim; I can work with that".

So I do another experiment, starting with the one-item-per-line text file:

foo
bar
baz

and now, I want to join them with colons, so it looks like the very first incarnation, above.

So I run:

:%s/^M/:/

But this fails, with the error:

E486: Pattern not found: ^M

However, this command does work:

:%s/n/:/

producing:

foo:bar:biz:

(I can get rid of the trailing colon myself)

So Question 2 : Why does n work in this case, where ^M does not?

And ultimately, Question 3 : Why is there this asymmetry between n and ^M depending on whether it's on the right- or left-hand side of a string replacement command?


When searching, n is a "catch-all" atom that conveniently matches any kind of "end-of-line": CRLF , CR , and LF .

When replacing, n is <Nul> and represented as ^@ .

When replacing, r is the legal "end-of-line" for the current fileformat .

In short, get used to this pattern and carry on:

:s/n/r

See :help NL-used-for-Nul and CR-used-for-NL .

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

上一篇: 在IntelliJ中找到当前文件

下一篇: ^ v vs \ n在vim字符串替换中