Remplacer un caractere ^M en Vi [Résolu/Fermé]

Signaler
-
Messages postés
166
Date d'inscription
mardi 19 mai 2009
Statut
Membre
Dernière intervention
9 septembre 2017
-
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

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

super pas utile quand vim n'est pas installé
Messages postés
5493
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
26 avril 2021
933
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
Voici la réponse :

tapez la commande suivante :

:1$ s/\r//g


Merci pour votre disponibilité
sans oublier le ";"

:1;$ s/\r//g

;-)
plutôt le caractere "," ce qui donne:
:1,$ s/\r//g
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 ? )
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
> 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
> 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
> 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 )
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 533
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
Messages postés
3011
Date d'inscription
vendredi 18 juin 2004
Statut
Contributeur
Dernière intervention
12 novembre 2020
408
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 :Þ

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
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
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..
> 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
$ 
> lami20j
OK, merci
%!tr '\015' '\;'
Messages postés
166
Date d'inscription
mardi 19 mai 2009
Statut
Membre
Dernière intervention
9 septembre 2017
45
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.