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

匿名 (未验证) 提交于 2019-12-03 02:08:02

问题:

vim shows on every line ending ^M

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

回答1:

This is the only thing that worked for me:

:e ++ff=dos

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



回答2:

Command

:%s//\r/g 

Where means type Ctrl+V then Ctrl+M.

Explanation

:%s 

substitute, % = all lines

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



回答3:

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.



回答4:

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.



回答5:

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 - hope this helps:

:%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.



回答6:

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.



回答7:

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.



回答8:

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



回答9:

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



回答10:

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

s/^M//g 


回答11:

Simple thing that worked for me

dos2unix   filename 


回答12:

I did this with sed:

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



回答13:

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.



回答14:

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//\r/g 

Where 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///g 

Where % means "in this buffer," s means "substitute," / means "(find) the following pattern," 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.



回答15:

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"  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, 


回答16:

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.



回答17:

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


回答18:

use dos2unix utility if the file was created on windows, use mac2unix utility if the file was created on mac. :)



回答19:

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

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



回答20:

This worked for me:

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

So in vim:

:set ff=unix :w 


回答21:

This worked for me:

:% s/\r\n/\r 


回答22:

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 d :%s/^M//g


回答23:

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



回答24:

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



回答25:

I know this maybe too old, but hope someone can find this useful.

Use on of these commands:

:%s/\r//g 

Or

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


回答26:

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

sed 's/\r//g' 


回答27:

Just removeset binary in your .vimrc!



回答28:

" This function preserves the list of jumps

fun! Dos2unixFunction() let _s=@/ let l = line(".") let c = col(".") try     set ff=unix     w!     "%s/\%x0d$//e catch /E32:/     echo "Sorry, the file is not saved." endtry let @/=_s call cursor(l, c) endfun com! Dos2Unix keepjumps call Dos2unixFunction() 


回答29:

I've spent an afternoon struggling with \n ctrl-v 012 (both of which supply me with null). & laboured through this thread until I reached metagrapher's.

\r worked fine for me!

/),/s/),/)\r/g 

turned something like this:

blacklist-extra:i386 (0.4.1, 0.4.1+nmu1), libmount1:i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1:i386 (2.20.1-5.1, 2.20.1-5.2), libapt-pkg4.12:i386 (0.9.7.4 , 0.9.7.5), nmap:i386 (6.00-0.1, 6.00-0.2), libsane-common:i386 (1.0.22-7.3,

into something like this:

26 libwv-1.2-4:i386 (1.2.9-3, automatic)
27 openjdk-6-jre-headless:i386 (6b24-1.11.4-3, automatic)
28 jed:i386 (0.99.19-2.1)

Magic. I am profoundly grateful



回答30:

Or instead of using vim you can just fix the line breaks using this command

fromdos 

Hope it helps!



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!