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


Translate

vim shows on every line ending ^M

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


所有的回答
  • Translate

    This is the only thing that worked for me:

    :e ++ff=dos

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


  • Translate

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


  • Translate

    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.


  • Translate

    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.


  • Translate

    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.


  • Translate

    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.


  • Translate

    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.


  • Translate

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


  • Translate

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


  • Translate

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

    s/^M//g
    

  • Translate

    Simple thing that worked for me

    dos2unix   filename
    

  • Translate

    I did this with sed:

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


  • Translate

    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.


  • Translate

    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.


  • Translate

    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

  • Translate

    This worked for me:

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

    So in vim:

    :set ff=unix
    :w
    

  • Translate

    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,
    

  • Translate

    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.


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

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


  • Translate

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


  • Translate

    This worked for me:

    :% s/\r\n/\r
    

  • Translate

    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>
    

  • Translate

    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


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


  • Translate

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

    sed 's/\r//g'
    

  • Translate

    Just removeset binary in your .vimrc!


  • Translate

    Use one of these commands:

    :%s/\r//g
    

    Or

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

  • Translate

    " 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()
    

  • Translate

    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


  • Translate

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

    fromdos <filename.txt>
    

    Hope it helps!