Remplacer un caractere ^M en Vi

Résolu
guin -  
leon91490 Messages postés 200 Date d'inscription   Statut Membre Dernière intervention   -
J'ai plein de caractere ^M dans mon fichier Vi sous linux
avez un moyen pour s 'en debarasser

J'ai essayer :1;$ s/\^M//g ca ne marche pas !!

Merci pour votre aide

9 réponses

  1. jdautz
     
    Je répond à ce vieux post parce qu'il est bien placé dans google et que les réponses sont assez légères...

    bref, il suffit de taper dans vim:
    :set fileformat=unix

    et le fichier est converti avec les fins de lignes de unix.
    inversement:
    :set fileformat=dos
    permettra aux utilisateurs de windows de lire votre fichier de manière agréable. Cette commande fixe le format du fichier, il n'est donc pas nécessaire de le refaire à chaque ouverture.

    La commande unix
    file mon_fichier.txt
    permet de connaître le type de mon_fichier.txt (où de n'importe quel fichier avec un contenu mime valide)

    Et effectivement, avec le paquet tofrodos installé, vous avez les commandes:
    fromdos mon_fichier.txt
    todos mon_fichier.txt
    dont le nom est assez explicite.

    Dans la même catégorie dans vim:
    :set fileencoding=utf-8
    converti le fichier iso-machin ou latinX en utf8

    inversement:
    :set fileencoding=iso-8859-15
    converti le fichier pour être lisible sous win98 ou pour votre site web obsolète ]:->

    En ligne de commande, "iconv" fera des merveilles. Pour plus de précision:
    man iconv
    36
    1. jj
       
      super pas utile quand vim n'est pas installé
      0
  2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Bounjour guin,

    Pour compléter la réponse, dans "vi", tu peux taper des caractères non imprimable du type "^M" (qui signifie "Ctrl-M" cette combinaison donnant le code ASCII équivalent à la la touche "entrée") en tapant "Ctrl-v" suivi de ta touche non imprimable.

    Donc en tapant Ctrl-v puis Ctrl-M, tu obtiens un "^M" compris par vi comme étant le caractère non imprimable Ctrl-M.

    Dal
    13
  3. guin
     
    Voici la réponse :

    tapez la commande suivante :

    :1$ s/\r//g

    Merci pour votre disponibilité
    8
    1. OdEa
       
      sans oublier le ";"

      :1;$ s/\r//g

      ;-)
      0
    2. Karim
       
      plutôt le caractere "," ce qui donne:
      :1,$ s/\r//g
      0
  4. Joseph Tux
     
    Bonjour,
    Pour des raisons inexplicables dos2unix (ou fromdos) est inefficace sur ce fichier bourré de ^M ,et ne faisant qu'une seule énorme ligne !

    Pour remplacer les ^M par un vrai retour à la ligne, on peut faire:

    :% s/^M/\r/g ( ^M s'obtenant comme il est dit ci dessus: Ctrl V + Ctrl M )

    mais
    :% s/\r/\r/g marche aussi bien !!! ( vim 7 sous Linux Debian etch )

    ( les raisons sont peut-être qu'il aurait fallu un mac2unix ? )
    2
    1. lami20j
       
      Salut,

      ( les raisons sont peut-être qu'il aurait fallu un mac2unix ? )
      Je ne le pense pas ;-)

      lami20j@debian:~$ cat -v CR
      ligne1^M
      ligne2^M
      lami20j@debian:~$ perl -pi -e 's/\r//' CR
      lami20j@debian:~$ cat -v CR
      ligne1
      ligne2
      lami20j@debian:~$ perl -pi -e 's/\n/\r\n/' CR
      lami20j@debian:~$ cat -v CR
      ligne1^M
      ligne2^M
      lami20j@debian:~$ sed -i 's/\r//' CR
      lami20j@debian:~$ cat -v CR
      ligne1
      ligne2
      0
      1. Joseph Tux > lami20j
         
        Bonjour
        Très intéressant, mais mon fichier se présentait avec 1 seule très longue ligne , bourrée ^M


        ( il s'agit du fichier sommaire.html du squelette SPIP: IENSP-XvPP qui se trouve ici: http://www.stephane-kus.fr/IMG/zip/IENSP-XvPP-3-1.zip )

        merci
        0
      2. lami20j > Joseph Tux
         
        Salut,

        mais mon fichier se présentait avec 1 seule très longue ligne , bourrée ^M

        Ben, il fallait le dire (.orig c'est pour sauvegarder l'original)
        perl -pi.orig -e 's/\r//g' fichier
        0
      3. Joseph Tux > lami20j
         
        Merci lami20, mais avec cette solution, si on ellimine bien les nombreux ^M, on ne les remplace pas pour autant par des retours à la ligne comme on les voudrait ! Ils sont justes supprimés.

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

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

        sont sans aucun effets ( contrairement à la substitution sous vim qui m' a rendu loyalement ce service )
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    La commande unix
    file mon_fichier.txt
    permet de connaître le type de mon_fichier.txt


    En complément, la commande cat permet de voir les caractères non imprimables
    cat -A fichier.txt
    --
    106485010510997108
    1
  7. kelux Messages postés 3065 Date d'inscription   Statut Contributeur Dernière intervention   434
     
    Salut,

    Le fichier en question était il stocké sous windows auparavant ?

    J'avais un probleme un peu similaire (des retours à la ligne avec un \M ou L, je ne me souviens plus de la lettre), un script que j'avais stocké sous windows et lu avec vi sous linux.

    J'ai utilisé le programme 'dos2unix'

    Ensuite le script etait comme neuf :)

    Luc L.
    [Gentoo] enfin :Þ
    0
  8. Utilisateur anonyme
     
    voui, je souscriche, encore que chez moi le machçin s'appelle fromdos

    fromdos < tonfichierdégueulasse > tonfichiertouprop

    mais juste une remarque par rapport à ton remplacement dans vi: les caractères de contrôle, tu ne les tapes pas avec un chapeau (même échappé) puis le caractère. pour avoir ton "chapeau-M" tu tapes Ctrl-V Ctrl-M

    tous les caractères de contrôle se tapent comme ça, Ctrl-V suivi de ton caractère de controle

    ce qui donne (mais je suis pas sûr que ça va apparaitre... ah ben non ça n'apparaît pas)

    un tien dans les champs
    tu l'auras méchant
    0
  9. lami20j
     
    Salut,

    on ne les remplace pas pour autant par des retours à la ligne comme on les voudrait
    C'est normal puisque c'est ça que j'ai exécuté et j'ai du mal comprendre que c'est ça que tu veux en fait ;-)

    Sinon
    lami20j@debian:~$ cat -v fic_
    ligne1^Mligne2^Mligne3^Mligne4^M
    lami20j@debian:~$ perl -pi.orig -e 's/\r/\n/g' fic_
    lami20j@debian:~$ cat -v fic_
    ligne1
    ligne2
    ligne3
    ligne4
    
    lami20j@debian:~$ cat -v fic_.orig
    ligne1^Mligne2^Mligne3^Mligne4^M
    

    Et si tu veux garder le format dos
    lami20j@debian:~$ cat -v fic_
    ligne1^Mligne2^Mligne3^Mligne4^M
    lami20j@debian:~$ perl -pi.orig -e 's/\r/\r\n/g' fic_
    lami20j@debian:~$ cat -v fic_
    ligne1^M
    ligne2^M
    ligne3^M
    ligne4^M
    
    lami20j@debian:~$ cat -v fic_.orig
    ligne1^Mligne2^Mligne3^Mligne4^M
    
    0
    1. Joseph Tux
       
      Cela me semble simple à décrire:

      Mon fichier ne fait qu'une seule ligne, bourrée de ^M
      Je veux que chaque ^M affiché devienne une vraie nouvelle ligne

      Parmi toutes ces méthodes, seule celle que j'ai indiquée a pu fonctionner sur ce fichier.

      Je suis sous Debian Etch, Gnome, et quel que soit le mode codage du Terminal GNOME ( v 2.14.2 ), aucun (iso-1 iso-15 ou UTF-8 ) ne résout ce problème ( habituellement sous UTF-8 et en Français )

      es-tu aller voir/tester le fichier en question ?

      sa description par file est la suivante:

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

      je pense que le "non-iso" doit bien parler de ça..
      0
      1. lami20j > Joseph Tux
         
        Salut,

        es-tu aller voir/tester le fichier en question ?
        Bien sur que oui ;-(
        J'ai testé la commande de remplacement que j'ai écrit sur tes fichiers (ce que tu m'as donnée au message 10) et ça fonctionne.
        Je ne sais pas pourquoi tu n'as par réussi.

        Pour te faire plaisir je viens de tester encore une fois.
        Voilà ce que j'ai
        $ 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, merci
        0
    2. Richy
       
      %!tr '\015' '\;'
      0
  10. leon91490 Messages postés 200 Date d'inscription   Statut Membre Dernière intervention   47
     
    et aussi pour éviter les problemes sur les echanges de fichiers via un montage windows ou vers windows on peut faire

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

    bien pratique lorsque on envoie ou recoit des fichiers de config vers windows.
    0