Replace a ^M character in Vi

Solved
guin -  
leon91490 Posted messages 200 Registration date   Status Member Last intervention   -
J have a lot of ^M characters in my Vi file under Linux
do you have a way to get rid of them

I tried :1;$ s/\^M//g but it doesn't work!!

Thank you for your help

9 answers

  1. jdautz
     
    I'm responding to this old post because it ranks well on Google and the answers are quite light...

    In short, just type in vim:
    :set fileformat=unix

    and the file is converted with Unix line endings.
    Conversely:
    :set fileformat=dos
    will allow Windows users to read your file comfortably. This command sets the file format, so there’s no need to do it again each time you open it.

    The Unix command
    file my_file.txt
    allows you to know the type of my_file.txt (or any file with valid mime content)

    And indeed, with the tofrodos package installed, you have the commands:
    fromdos my_file.txt
    todos my_file.txt
    which have quite explicit names.

    In the same category in vim:
    :set fileencoding=utf-8
    converts the iso-something or latinX file to utf8

    Conversely:
    :set fileencoding=iso-8859-15
    converts the file to be readable on win98 or for your outdated website ]:->

    On the command line, "iconv" will do wonders. For more precision:
    man iconv
    36
    1. jj
       
      super not useful when vim is not installed
      0
  2. [Dal] Posted messages 6122 Registration date   Status Contributor Last intervention   1 108
     
    Hello Guin,

    To complete the answer, in "vi", you can type non-printable characters like "^M" (which means "Ctrl-M", this combination gives the ASCII code equivalent to the "enter" key) by pressing "Ctrl-v" followed by your non-printable key.

    So by typing Ctrl-v then Ctrl-M, you get a "^M" understood by vi as the non-printable character Ctrl-M.

    Dal
    13
  3. guin
     
    Here is the response:

    type the following command:

    :1$ s/\r//g

    Thank you for your availability
    8
    1. OdEa
       
      without forgetting the ";"

      :1;$ s/\r//g

      ;-)
      0
    2. Karim
       
      rather the character "," which gives:
      :1,$ s/\r//g
      0
  4. Joseph Tux
     
    Hello,
    For inexplicable reasons, dos2unix (or fromdos) is ineffective on this file filled with ^M and that is just one huge line!

    To replace ^M with an actual line break, you can do:

    :% s/^M/\r/g (where ^M is obtained as mentioned above: Ctrl V + Ctrl M )

    but
    :% s/\r/\r/g works just as well!!! (vim 7 on Linux Debian etch)

    (the reasons might be that a mac2unix was needed?)
    2
    1. lami20j
       
      Hello,

      (the reasons might be that a mac2unix was needed?)
      I don't think so ;-)

      lami20j@debian:~$ cat -v CR line1^M line2^M lami20j@debian:~$ perl -pi -e 's/\r//' CR lami20j@debian:~$ cat -v CR line1 line2 lami20j@debian:~$ perl -pi -e 's/\n/\r\n/' CR lami20j@debian:~$ cat -v CR line1^M line2^M lami20j@debian:~$ sed -i 's/\r//' CR lami20j@debian:~$ cat -v CR line1 line2
      0
      1. lami20j > Joseph Tux
         
        Hi,

        but my file was formatted with just one very long line, stuffed with ^M

        Well, you should have said so (.orig is for backing up the original)
        perl -pi.orig -e 's/\r//g' file
        0
      2. Joseph Tux > lami20j
         
        Thank you lami20, but with this solution, while we do successfully eliminate the numerous ^M, we do not replace them with line breaks as we would like! They are just removed.

        perl -pi.orig -e 's/^M/\r/g' sommaire.html

        perl -pi.orig -e 's/\r/\r/g' sommaire.html

        have no effect (unlike the substitution in vim which faithfully provided this service for me).
        0
  5. lami20j Posted messages 21506 Registration date   Status Moderator, Security Contributor Last intervention   3 571
     
    Hello,

    The Unix command
    file mon_fichier.txt
    allows you to know the type of mon_fichier.txt


    Additionally, the cat command allows you to see non-printable characters
    cat -A fichier.txt
    --
    106485010510997108
    1
  6. kelux Posted messages 3065 Registration date   Status Contributor Last intervention   434
     
    Hi,

    The file in question was it previously stored under Windows?

    I had a somewhat similar problem (line breaks with a \M or L, I can't remember the letter), a script that I had stored under Windows and read with vi under Linux.

    I used the 'dos2unix' program

    Then the script was like new :)

    Luc L.
    [Gentoo] finally :Þ
    0
  7. Anonymous user
     
    voui, I subscribe, although at my place the machine is called fromdos

    fromdos < yourdisgustingfile > yourcleanfile

    but just a note regarding your replacement in vi: control characters, you don't type them with a hat (even escaped) followed by the character. to get your "hat-M" you type Ctrl-V Ctrl-M

    all control characters are typed like this, Ctrl-V followed by your control character

    which results in (but I'm not sure this will appear... oh well no, it doesn't appear)

    one in the fields
    you’ll have it nasty
    0
  8. lami20j
     
    Hello,

    we don't replace them with line breaks as we would like
    It's normal since that's what I executed and I must have misunderstood that this is what you actually want ;-)

    Otherwise
    lami20j@debian:~$ cat -v fic_ line1^Mline2^Mline3^Mline4^M lami20j@debian:~$ perl -pi.orig -e 's/\r/\n/g' fic_ lami20j@debian:~$ cat -v fic_ line1 line2 line3 line4 lami20j@debian:~$ cat -v fic_.orig line1^Mline2^Mline3^Mline4^M 

    And if you want to keep the DOS format
    lami20j@debian:~$ cat -v fic_ line1^Mline2^Mline3^Mline4^M lami20j@debian:~$ perl -pi.orig -e 's/\r/\r\n/g' fic_ lami20j@debian:~$ cat -v fic_ line1^M line2^M line3^M line4^M lami20j@debian:~$ cat -v fic_.orig line1^Mline2^Mline3^Mline4^M 
    0
    1. Joseph Tux
       
      It seems simple to describe:

      My file is just a single line, stuffed with ^M
      I want each ^M displayed to become a real new line

      Among all these methods, only the one I mentioned worked on this file.

      I am using Debian Etch, Gnome, and regardless of the encoding mode of the GNOME Terminal (v 2.14.2), none (iso-1 iso-15 or UTF-8) solves this problem (usually under UTF-8 and in French)

      Did you go see/test the file in question?

      Its description by file is as follows:

      file sommaire.html: Non-ISO extended-ASCII HTML document text, with CR line terminators

      I think the "non-iso" must refer to this..
      0
      1. lami20j > Joseph Tux
         
        Hi,

        Did you go see/test the file in question?
        Of course I did;-(
        I tested the replacement command that I wrote on your files (the one you gave me in message 10) and it works.
        I don't know why you couldn't get it to work.

        To please you, I just tested it once again.
        Here’s what I have
        $ file sommaire.html sommaire.html: Non-ISO extended-ASCII HTML document text, with CR line terminators $ perl -pi.orig -e 's/\r/\n/g' sommaire.html  $ file sommaire.html sommaire.html: Non-ISO extended-ASCII HTML document text $ file sommaire.html.orig sommaire.html.orig: Non-ISO extended-ASCII HTML document text, with CR line terminators $ mv sommaire.html.orig sommaire.html $ file sommaire.html sommaire.html: Non-ISO extended-ASCII HTML document text, with CR line terminators $ perl -pi.orig -e 's/\r/\r\n/g' sommaire.html  $ file sommaire.html sommaire.html: Non-ISO extended-ASCII HTML document text, with CRLF line terminators $ file sommaire.html.orig sommaire.html.orig: Non-ISO extended-ASCII HTML document text, with CR line terminators $ 
        0
      2. Joseph Tux > lami20j
         
        OK, thanks
        0
    2. Richy
       
      %!tr '\015' '\;'
      0
  9. leon91490 Posted messages 200 Registration date   Status Member Last intervention   47
     
    and also to avoid issues with file exchanges via a Windows share or to Windows, we can do

    mount //hostWindows/montage /media/reseau/ -o user,uid=me,gid=me,conv=auto,iocharset=utf8

    very handy when sending or receiving configuration files to Windows.
    0