Trucs:Supprimer les ^M dans les fichiers ASCII
Supprimer les ^M dans les fichiers ASCII
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...
#*********************************************************************
# 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 les0D
. - Lors du tranfert du fichier sur votre système Unix-like, préférez le protocole FTP en mode ascii, si possible.
Autre méthode avec vim
Par Rémi Collet
C’est prévu dans vim, en utilisant set fileformat
.
Suppression des ^M
Ajout des ^M
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
Où dos2unix est le script suivant :
awk '{ sub("\r$", ""); print }' $1 > $2
Variante, par Manisero (manisero chez freesurf point fr) :
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 :
Cette solution est une des plus simples, et moins lourde que d'utiliser perl, awk ou d'écrire un script.
Méthode avec des encodeurs de formats de fichiers texte
Par nicola
On peut utiliser recode ou konwert, le deuxième s’utilise ainsi :
- Vers Unix et Amiga :
konwert lf lefichier
- Vers Mac :
konwert cr lefichier
- Vers Windows et DOS :
konwert crlf lefichier
Il trouve tout seul l’encodage en entrée.