Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

dos2unix is a commandline utility that will do this, or :%s/^M//g will if you use Ctrl - v Ctrl - m to input the ^M, or you can :set ff=unix and Vim will do it for you.

There is documentation on the fileformat setting, and the Vim wiki has a comprehensive page on line ending conversions .

Alternately, if you move files back and forth a lot, you might not want to convert them, but rather to do :set ff=dos , so Vim will know it's a DOS file and use DOS conventions for line endings.

:%s/^M//g should be :%s/\r//g , because ^M just means "match capital "M" at the beginning of the line". Bunyk Sep 12, 2013 at 8:52 crtl-v is no good, on windows it pastes clipboard contents to the command line. Solution :%s/\r//g worked for me, cheers @Bunyk roblogic May 26, 2015 at 3:32 I must be missing something, because set ff=unix does nothing. Maybe it converts the file, but all of the ^M characters are still there. felwithe Mar 30, 2017 at 16:11

This can also be used as saving operation (:w alone will not save using the line endings you see on screen):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

And you can use it from the command-line:

for file in *.cpp
    vi +':w ++ff=unix' +':q' "$file"
                This should be the most upvoted answer. :w +ff=unix is so much nicer than most of the other stuff written here, and the bash script is a nice bonus.
– mkasberg
                Jun 18, 2017 at 3:42
                The :e commands don't appear to do anything on my Windows vim install.  My view still shows the ^M codes.
– Grant Birchmeier
                Jun 20, 2017 at 21:28
                I read the :e ++ff=unix everywhere but the simplest for me that worked is :w ++ff=unix then quit & reopen file.
– Olivier Pons
                Dec 6, 2020 at 10:06
                @OlivierPons but :e does the same thing as reopening the file? How is adding more unnecessary steps to your solution making it simpler?
– Victor Zamanian
                Jan 8, 2021 at 7:50
                I've never had any problem with :set ff=unix before, but the file I opened today must have been particularly weird. Vim said it was already fileformat=unix but all the line endings were ^M. This solution worked for me.
– Chris B
                Mar 21, 2013 at 8:55
                This solution adds unwanted extra lines for me, doubling the number of lines in the file. :%s/\r//g instead works for me.
– Victor Zamanian
                Aug 22, 2013 at 23:57
                Victor, your files likely have \r\n endings. the \r isn't read as a newline but the \n is.  In the files I'm running into are \r and you have to add a newline character.
– Joeyjoejoejr
                Feb 12, 2015 at 20:59
                @VictorZamanian's :%s/\r//g is the only general-purpose solution – especially for mixed-mode files containing a heterogeneous admixture of both DOS- and UNIX-style newlines. The canonical solutions (e.g., :set ff=unix, :e ++ff=unix) assume every line of the current buffer ends in the same newline style. Sometimes they do; sometimes they don't. Cue sadface.
– Cecil Curry
                Sep 28, 2019 at 3:24
:set fileformat=unix

You can also use mac or dos to respectively convert your file to Mac or MS-DOS/Windows file convention. And it does nothing if the file is already in the correct format.

For more information, see the Vim help:

:help fileformat
                This command doesn't appear to do anything on my Windows vim.  My view still has ^M chars in it.
– Grant Birchmeier
                Jun 20, 2017 at 21:29
                This actually resolved the issue for me. I wasn't able to find those characters while searching.
– Captain Insaneo
                Aug 5, 2015 at 14:10
vim some_file.txt +'e ++ff=dos | set ff=unix | wq!'

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

set ff=unix - convert file to unix format.

Thank you. I managed to convert a file to the wrong format and couldn't use Git to undo it. This worked perfectly. – Paul Danelli Apr 20 at 12:22 For some reason above didn't work for me under windows gvim. But when changed to :%s/\r//g it worked like a charm. – soltysh Jan 23, 2014 at 9:35 +1 for pointing to the official doc site. For anyone using the above link, see the section "Converting the current file" on that page. – the Tin Man Jan 7, 2013 at 16:48

Convert directory of files from DOS to Unix

Using command line and sed, find all files in current directory with the extension ".ext" and remove all "^M"

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

Also, as mentioned in a previous answer, ^M = Ctrl+V + Ctrl+M (don't just type the caret "^" symbol and M).

dos2unix can directly modify the file contents.

You can directly use it on the file, without any need for temporary file redirection.

dos2unix input.txt input.txt

The above uses the assumed US keyboard. Use the -437 option to use the UK keyboard.

dos2unix -437 input.txt input.txt

The following steps can convert the file format for DOS to Unix:

:e ++ff=dos     Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix     This buffer will use LF-only line endings when written.[A 2]
:w     Write buffer using Unix (LF-only) line endings.

Reference: File format

done this on a linux server, the file had ^M endings. save as dos to keep, save as linux to remove. can check using cat -v – HattrickNZ May 11, 2016 at 20:58

The comment about getting the ^M to appear is what worked for me. Merely typing "^M" in my vi got nothing (not found). The CTRL+V CTRL+M sequence did it perfectly though.

My working substitution command was

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

and it looked like this on my screen:

:%s/^M/\r/g
:g/Ctrl-v Ctrl-m/s///

CtrlM is the character \r, or carriage return, which DOS line endings add. CtrlV tells Vim to insert a literal CtrlM character at the command line.

Taken as a whole, this command replaces all \r with nothing, removing them from the ends of lines.

The below command is used for reformating all .sh file in the current directory. I tested it on my Fedora OS.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

I wanted newlines in place of the ^M's. Perl to the rescue:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

Or to write to stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt

This is my way. I opened a file in DOS EOL and when I save the file, that will automatically convert to Unix EOL:

autocmd BufWrite * :set ff=unix

I knew I'd seen this somewhere. Here is the FreeBSD login tip:

Do you need to remove all those ^M characters from a DOS file? Try

tr -d \\r < dosfile > newfile
    -- Originally by Dru <[email protected]>

This is a little more than you asked for but:

nmap <C-d> :call range(line('w0'),line('w$'))->map({_,v-> getline(v)})->map({_,v->trim(v,join(map(range(1,0x1F)+[0xa0],{n->n->nr2char()}),''),2)})->map({k,v->setline(k+1,v)})<CR>

Run this and :set ff=unix|dos and no more need for unix2dos.

  • the single arg form of trim() has the same default mask above, plus 0X20 (an actual space) instead of 0x1F
  • that default mask clears out all non-printing chars including non-breaking spaces [0xa0] that are hard to find
  • create a list of lines from the range of lines
  • map that list to the trim function with using the same mask code as the source, less spaces
  • map that again to setline to replace the lines.
  • all :set fileformat= does at this point is choose which eol to save it with, dos or unix
  • it should be pretty easy to change the range of characters above if you want to eliminate or add some
  • To delete these DOS/Windows line endings characters all at once, regardless of where they occur in a line (this is not a good idea if two lines were separated only by a CR because the command joins the lines together):

    :%s/\r//g
    

    Reference: File format -> 6.Removing unwanted CR or LF characters.

    But, You could choose to convert these DOS/Windows line endings into Unix.

    That means, to convert the current file from any mixture of CRLF/LF-only line endings, so all lines end with LF only:

    :update              Save any changes. 
    :e ++ff=dos          Edit file again, using dos file format ('fileformats' is ignored).
    :setlocal ff=unix    This buffer will use LF-only line endings when written.
    :w                   Write buffer using unix (LF-only) line endings. 
    

    Reference: File format -> 3.Converting the current file.

    In the above, replacing :set ff=unix with :set ff=mac would write the file with mac (CR-only) line endings. Or, if it was a mac file to start with, you would use :e ++ff=mac to read the file correctly, so you could convert the line endings to unix or dos.

    More reference:

    1.Configure line separators -> Change line separators for the current file(IntelliJ IDEA).

    2.Configure line separators -> Configure line separators for new files(IntelliJ IDEA).

    3.Vim Tips Wiki -> File format.

    Usually there is a dos2unix command you can use for this. Just make sure you read the manual as the GNU and BSD versions differ on how they deal with the arguments.

    BSD version:

    dos2unix $FILENAME $FILENAME_OUT
    mv $FILENAME_OUT $FILENAME
    

    GNU version:

    dos2unix $FILENAME
    

    Alternatively, you can create your own dos2unix with any of the proposed answers here, for example:

    function dos2unix(){
        [ "${!}" ] && [ -f "{$1}" ] || return 1;
        { echo ':set ff=unix';
          echo ':wq';
        } | vim "${1}";
    

    If you create a file in Notepad or Notepad++ in Windows, bring it to Linux, and open it by Vim, you will see ^M at the end of each line. To remove this,

    At your Linux terminal, type

    dos2unix filename.ext
    

    This will do the required magic.