Trucs:Supprimer les ^M dans les fichiers ASCII

De Lea Linux
Révision datée du 22 janvier 2006 à 12:57 par Nicola (discussion | contributions) (réorganisation + titraille)
Aller à la navigation Aller à la recherche
contributeurs léa<>

Les caractères ^M que l'on peut rencontrer parfois dans les fichiers texte sous Unix proviennent du codage de la fin de ligne, qui diffère selon que le fichier a été édité sur un système Microsoft (CR LF, ou ^M et ^L) ou sur un Unix (LF seul). Les éditeurs de texte qui ne supportent pas le codage à la Microsoft affichent donc ce ^M superflu... Voyons ci-dessous des méthodes pour s'en débarrasser.

Méthode shell

Par fp (crontab_at_caramail_point_com)

Voilà enfin un modèle de fichier dos2unix pour ceux qui en cherchaient, Celui - ci est en ksh mais il est sûrement assez simple à adapter au bash...

#!/bin/ksh
#*********************************************************************
# fichier : dos2unix
# description : Conversion fichier DOS en fichier UNIX
# (suppression des ctrl M)
# parametres :
#*********************************************************************
# saisie nom de fichier a convertir
if [ $# -lt 1 ]
then
read F?"Fichier(s) a convertir :"
else
F=$*
fi

# traitement fichiers
for fic in $F
do
if [ ! -f $fic ]
then
echo $fic n\'est pas un fichier valide
continue
else
typ=`file $fic|grep -i -E "text|shell"`
if [ "${typ}a" = "a" ]
then
echo Fichier $fic Non ASCII
else
tr -d "\015\023" <$fic >${fic}.$$
# aclget $fic | aclput ${fic}.$$
mv ${fic}.$$ $fic
echo $fic converti
fi
fi
done

Remarque (R. LEROY): Pour Debian si vous voulez faire encore plus rapide :
apt-get install sysutils
puis dos2unix fichier.txt

Méthode avec vi

Par Jonesy(jonesy_at_wanadoo_point_fr)

Suite au Trucs & Astuces de FP, que je vous invite à consulter, je vous propose une autre méthode afin de supprimer ces sales bêtes.

Avant tout, sachez que le ^M que vous voyez dans votre fichier texte est la manifestation du retour à la ligne des fichiers sur un système Microsoft Windows.
Sur les Unix-like (Linux, *BSD, Mac OS X, ...) le retour à la ligne est le code ascii 10 (<Ctrl-Alt-10> ou 0A en hexadécimal), alors que sous un système de Microsoft, le retour à la ligne est l'ensemble des deux codes ascii dans l'ordre : 13 et 10 (<Ctrl-Alt-13> et <Ctrl-Alt-10> ou 0D et 0A en hexadécimal).

Donc pour supprimer ces fameux ^M, faites comme suit :

Ouvrez votre fichier avec vi (ou vim, gvim, ...).
Une fois le fichier ouvert, tapez :
:%s/<Ctrl-v><entrée>//g

Pour rendre cette manipulation plutot ingrate automatique, faites en une macro !
Editer votre fichier ~/.vimrc et ajoutez y la ligne suivante :
map v :%s/<Ctrl-v><Ctrl-v><Ctrl-v><Ctrl-v><Ctrl-v><entrée>//g
Ensuite, lorsque vous ouvrirez un fichier avec des ^M, il vous suffira de taper v et <entrée>.

Cette solution a l'avantage de marcher sur tous les systèmes Unix-like, car vi (ou un clone) est présent sur tous les systèmes Unix-like.

D'autres solutions possibles :

  • Ouvrir le fichier avec un éditeur hexadécimal, comme ghex, et supprimer tous les 0D.
  • Lors du tranfert du fichier sur votre système Unix-like, préférez le protocole FTP en mode ascii, si possible.
NDM: voir aussi la fin de l'[../software/vi.php3 article sur vi].

Autre méthode avec vim

Par Rémi Collet

C'est prévu dans vim, en utilisant set fileformat.

Ex : Supression des ^M

:set fileformat=unix

Ex : Ajout des ^M

:set fileformat=dos

Remarque : il y a même le format Mac.

Encore une méthode avec vim

Si d'aventure vous vous retrouvez avec un fichier sur une seule ligne, et qu'au vu des commentaire précédents vous obtenez un fichier vidé de ses ^M mais toujours sur une ligne, reprenez le fichier brut (pas celui dans lequel on ne distingue plus les fins de lignes; autrement dit le fichier sur lequel vous n'avez appliqué aucune des précédentes méthodes) :

$ vim lefichierenquestion

une fois sous vim :

:%s/{ctrl-v}{ctrl-m}/{ctrl-v}{entrée}/g

et voilà!

Méthode avec dos2unix

Par Zeck (zeck_at_netliberte_point_org)

Syntaxe : dos2unix srcfile destfile

dos2unix est le script suivant :

#!/bin/bash
awk '{ sub("\r$", ""); print }' $1 > $2

Variante, par Manisero (manisero chez freesurf point fr) :

#!/bin/bash
cat $1 | tr -d '\r' >$2

Méthode avec Perl

Par Arnaud ASSAD (arhuman_at_hotmail_point_com

perl -pi -e 's/\r//g' fichieramodifier.extension

Accepte les widlcards :

perl -pi -e 's/\r//g' *.c

Méthode avec tr

Par Marcopol (mlebas_at_labeille_point_net)

Voilà un sujet qui inspire beaucoup ici, voici une solution plus conventionelle :

$ cat mon_fichier.txt | tr -d '\r' > mon_nouveau_fichier.txt

Cette solution est une des plus simples, et moins lourde que d'utiliser perl, awk ou d'écrire un script.