How to convert the ^M linebreak to 'normal' linebreak in a file opened in vim?

Viewed 413000

vim shows on every line ending ^M

How I do to replace this with a 'normal' linebreak?

37 Answers

Command

:%s/<Ctrl-V><Ctrl-M>/\r/g

Where <Ctrl-V><Ctrl-M> means type Ctrl+V then Ctrl+M.

Explanation

:%s

substitute, % = all lines

<Ctrl-V><Ctrl-M>

^M characters (the Ctrl-V is a Vim way of writing the Ctrl ^ character and Ctrl-M writes the M after the regular expression, resulting to ^M special character)

/\r/

with new line (\r)

g

And do it globally (not just the first occurrence on the line).

On Linux and Mac OS, the following works,

:%s/^V^M/^V^M/g

where ^V^M means type Ctrl+V, then Ctrl+M.

Note: on Windows you probably want to use ^Q instead of ^V, since by default ^V is mapped to paste text.

Within vim, look at the file format — DOS or Unix:

:set filetype=unix

:set fileformat=unix

The file will be written back without carriage return (CR, ^M) characters.

First, use :set ff? to figure out the file format your file is.

I guess it could be unix, then the problem is your file was created with fileformat=dos adding "^M^J" to the line end but read with flieformat=unix only removing the "^J" from the line end, leaving the "^M" there.

Just input :e ++ff=dos in Vim command line to change your file's format from unix to dos. It should solve the problem. If not, :%s/\r//g should help you out.

^M is retrieved by Ctrl+V and M, so do

s/^M//g

Alternatively, there are open-source utilities called dos2unix and unix2dos available that do this very thing. On a linux system they are probably installed by default; for a windows system you can download them from http://www.bastet.com/ amongst others.

To save keystrokes, you can avoid typing Ctrl+VCtrl+M by placing this in a mapping. Just open a file containing a ^M character, yank it, and paste it into a line like this in your .vimrc:

nnoremap <Leader>d :%s/^M//g<CR>

To use sed on MacOS, do this:

sed -i.bak $'s/\r//' <filename>

Explanation: The $'STRING' syntax here pertains to the bash shell. Macs don't treat \r as special character. By quoting the command string in $'' you're telling the shell to replace \r with the actual \r character specified in the ANSI-C standard.

In command mode in VIM:

:e ++ff=dos | setl ff=unix | up

e ++ff=dos - force open file in dos format.

setl ff=unix - convert file to unix format.

up - save file only when has been modified.

On Solaris:

:%s/<CTRL+V><CTRL+M>//g

that is:

:%s/^M//g

That means:

  • % = all lines,
  • s = substitute,
  • ^M = what you desire to substitute
  • // = replace with nothing
  • g = globally (not only the first occurrance)
Related