29

I use GVim on Windows 7.

I want to learn how to put newline characters by using regex substitutions. To do this I try to use \r and \n metacharacters but the substituted text doesn't show normal newlines.

For example, at the beginning I have:

line 1
line 2

Before substitution

I use the following substitution expression:

:%s/\n/\n\n/g

Then GVim produces the following text:

line 1^@^@line 2^@^@

After substitution with \n as newline characters

Instead, if I use \r\n in the substitution expression

:%s/\n/\r\n/g

Then GVim produces the following text:

line 1
^@line 2
^@

After substitution with \r\n as newline

What are those ^@ characters?

How to use newline characters in the substitution expression properly?

Mert Nuhoglu
  • 9,695
  • 16
  • 79
  • 117

2 Answers2

40

^@ is a nul


For some reason, vim wants to see \r in the replacement text in order to insert a newline. (\n in the replacement inserts a nul.)

So, after succesfully locating newlines by running /\n, try:

s//\r/

Or to add an extra newline:

s/$/\r/

On the pattern side, \r means an actual (015) CR character, leading to the following strange-looking command when you want to replace returns with newlines:

s/\r/\r/

No, it's not a no-op.

rpyzh
  • 917
  • 6
  • 9
DigitalRoss
  • 143,651
  • 25
  • 248
  • 329
  • In my Vim 7.3 on Windows 7, the suggested `s/\r/\r/` gives error 'E486: Pattern not found: \r'. Was it tested to work on a prior version somehow? – rpyzh Dec 31 '13 at 21:47
  • 2
    For more info on metacharacter usage difference in search vs. replace, see [this SO answer](http://stackoverflow.com/a/3966089/2664868). – rpyzh Dec 31 '13 at 21:50
5

This

s/\r/\r/

fails. But

s/\n/\r/

works fine.

Aaron
  • 428
  • 5
  • 14