ByteNirvana
ByteNirvana

Reputation: 5700

Convert ^M (Windows) line breaks to normal line breaks

Vim shows ^M on every line ending.

How do I replace this with a normal line break in a file opened in Vim?

Upvotes: 525

Views: 434613

Answers (30)

swimfar2
swimfar2

Reputation: 167

If you can see the control characters but your searches are unable to find them using the other methods, and dos2unix isn't working, here's what worked for me.

Move your cursor to the ^ character and press * to start a search for it. I had to manually add a carriage return after it (i.e., after the M) in order for the search to select what I wanted. Then you can run your substitution command on your current search by just leaving the pattern term empty.

:%s//\r/g

This will replace all of the ^M characters with newlines (\r) and perform it on every line (g=global)

Upvotes: 0

netpoetica
netpoetica

Reputation: 3425

A file I had created with BBEdit seen in MacVim was displaying a bunch of ^M line returns instead of regular ones. The following string replace solved the issue:

:%s/\r/\r/g

It's interesting because I'm replacing line breaks with the same character, but I suppose Vim just needs to get a fresh \r to display correctly. I'd be interested to know the underlying mechanics of why this works.

Upvotes: 129

Victor S.
Victor S.

Reputation: 2767

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.

Upvotes: 3

Donato Pirozzi
Donato Pirozzi

Reputation: 759

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)

Upvotes: 1

Muhammad Reda
Muhammad Reda

Reputation: 27023

Use one of these commands:

:%s/\r//g

Or

:%s/\r\(\n\)/\1/g

Upvotes: 5

Nitin Nain
Nitin Nain

Reputation: 5483

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.

Upvotes: 2

Metagrapher
Metagrapher

Reputation: 8912

in order to get the ^M character to match I had to visually select it and then use the OS copy to clipboard command to retrieve it. You can test it by doing a search for the character before trying the replace command.

/^M

should select the first bad line

:%s/^M/\r/g

will replace all the errant ^M with carriage returns.

This is as functions in MacVim, which is based on gvim 7.

EDIT:

Having this problem again on my Windows 10 machine, which has Ubuntu for Windows, and I think this is causing fileformat issues for vim. In this case changing the ff to unix, mac, or dos did nothing other than to change the ^M to ^J and back again.

The solution in this case:

:%s/\r$/ /g
:%s/ $//g

The reason I went this route is because I wanted to ensure I was being non-destructive with my file. I could have :%s/\r$//g but that would have deleted the carriage returns right out, and could have had unexpected results. Instead we convert the singular CR character, here a ^M character, into a space, and then remove all spaces at the end of lines (which for me is a desirable result regardless)

Sorry for reviving an old question that has long since been answered, but there seemed to be some confusion afoot and I thought I'd help clear some of that up since this is coming up high in google searches.

Upvotes: 29

falcucci
falcucci

Reputation: 319

Just removeset binary in your .vimrc!

Upvotes: 1

Micah Smith
Micah Smith

Reputation: 4463

There are many other answers to this question, but still, the following works best for me, as I needed a command line solution:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Explanation:

  • Without loading any .vimrc files, open myfile
  • Run :e ++ff=dos to force a reload of the entire file as dos line endings.
  • Run :w ++ff=unix to write the file using unix line endings
  • Quit vim

Upvotes: 10

CrannDarach
CrannDarach

Reputation: 81

Ctrl+M minimizes my window, but Ctrl+Enter actually inserts a ^M character. I also had to be sure not to lift off the Ctrl key between presses.

So the solution for me was:

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

Where <Ctrl-V><Ctrl-Enter> means to press and hold Ctrl, press and release V, press and release Enter, and then release Ctrl.

If you are working on a Windows-generated file

The above solution will add an additional line between existing lines, because there is already an invisible \r after the ^M.

To prevent this, you want to delete the ^M characters without replacing them.

:%s/<Ctrl-V><Ctrl-Enter>//g

Where % means "in this buffer," s means "substitute," / means "(find) the following pattern," <Ctrl-V><Ctrl-Enter> refers to the keys to press to get the ^M character (see above), // means "with nothing" (or, "with the pattern between these two slashes, which is empty"), and g is a flag meaning "globally," as opposed to the first occurrence in a line.

Upvotes: 8

Paul Tomblin
Paul Tomblin

Reputation: 182782

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.

Upvotes: 428

jiangdongzi
jiangdongzi

Reputation: 393

When in windows, try :%s/<C-Q><C-M>/g

Upvotes: -1

Vishwanath gowda k
Vishwanath gowda k

Reputation: 1695

In my case,

Nothing above worked, I had a CSV file copied to Linux machine from my mac and I used all the above commands but nothing helped but the below one

tr "\015" "\n" < inputfile > outputfile

I had a file in which ^M characters were sandwitched between lines something like below

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

Upvotes: 7

Stryker
Stryker

Reputation: 6120

This worked for me:

  1. Set file format to unix (\n line ending)
  2. save the file

So in vim:

:set ff=unix
:w

Upvotes: 7

robsn
robsn

Reputation: 744

Over a serial console all the vi and sed solutions didn't work for me. I had to:

cat inputfilename | tr -d '\r' > outputfilename

Upvotes: 0

Manoj Kumar
Manoj Kumar

Reputation: 21

^M gives unwanted line breaks. To handle this we can use the sed command as follows:

sed 's/\r//g'

Upvotes: 1

LeopardSkinPillBoxHat
LeopardSkinPillBoxHat

Reputation: 29421

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).

Upvotes: 617

BHarman
BHarman

Reputation: 602

Without needing to use Ctrl: :%s/\r$//

Upvotes: 17

Andrew Sledge
Andrew Sledge

Reputation: 10351

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

s/^M//g

Upvotes: 19

Freedom_Ben
Freedom_Ben

Reputation: 11943

I did this with sed:

sed -i -e 's/\r/\n/g' filename

Upvotes: 14

markyk
markyk

Reputation: 61

In vim, use command:

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

Where you want to search and replace:

\r\n

into

\r

and the

/g

is for global

Note that this is the same as the answer by @ContextSwitch but with the gobal flag

Upvotes: 0

Shravan Kumar
Shravan Kumar

Reputation: 705

:g/^M/s// /g

If you type ^M using Shift+6 Caps+M it won't accept.

You need to type ctrl+v ctrl+m.

Upvotes: 1

Shahzeb Khan
Shahzeb Khan

Reputation: 3642

Simple thing that worked for me

dos2unix   filename

Upvotes: 17

Blue Diamond
Blue Diamond

Reputation: 3069

sed s/^M//g file1.txt > file2.txt

where ^M is typed by simultaneously pressing the 3 keys, ctrl + v + m

Upvotes: 5

Cory
Cory

Reputation: 785

None of the above worked for me. (substitution on \r, ^M, ctrl-v-ctrl-m ) I used copy and paste to paste my text into a new file.

If you have macros that interfere, you can try :set paste before the paste operation and :set nopaste after.

Upvotes: 0

Tonatiuh
Tonatiuh

Reputation: 2485

What about just: :%s/\r//g That totally worked for me.

What this does is just to clean the end of line of all lines, it removes the ^M and that's it.

Upvotes: 11

d-_-b
d-_-b

Reputation: 23171

None of these worked for me, so I tried this, which worked:

type :%s/

press CTRL-VCTRL-M

type //g

press Enter

So the overall command in Vim shoud look like :%s/^M//g

What this does: :%s (find and replace) /^M/ (that symbol) / (with no chars) g (globally).

Upvotes: 24

ContextSwitch
ContextSwitch

Reputation: 2837

This worked for me:

:% s/\r\n/\r

Upvotes: 2

rogermushroom
rogermushroom

Reputation: 5586

None of these suggestions were working for me having managed to get a load of ^M line breaks while working with both vim and eclipse. I suspect that I encountered an outside case but in case it helps anyone I did.

:%s/.$//g

And it sorted out my problem

Upvotes: 1

Pam
Pam

Reputation: 4200

This is the only thing that worked for me:

:e ++ff=dos

Found it at: http://vim.wikia.com/wiki/File_format

Upvotes: 158

Related Questions