Trucs:Supprimer les ^M dans les fichiers ASCII

De Lea Linux
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 1

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 2

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].

Méthode 3

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 4

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 5

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.

Méthode 6

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.

Méthode 7 : Pour ceux qui n'on vraiment pas de bol ;)

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à!