Trucs: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 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...
#*********************************************************************
# 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 les0D
. - Lors du tranfert du fichier sur votre système Unix-like, préférez le protocole FTP en mode ascii, si possible.
Méthode 3
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 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 :
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
Ex : Ajout des ^M
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à!