Précédent   Forum du club des développeurs et IT Pro > Systèmes > Linux > Contribuez
Contribuez Vos contributions pour la rubrique Linux : articles, cours, tutoriels, faq, comparatifs, tests, sources, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/02/2011, 22h14   #1
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
Par défaut Comment convertir des fichiers texte Windows vers Unix

Bonjour,

C'est une proposition d'ajout à la FAQ:

Citation:
Windows et Unix ont des caractères de fin de ligne différents. En cas d'import de fichiers texte (y compris des scripts bash par exemple), il faut les convertir au format Unix sans quoi l'interprêteur (/bin/sh ou /bin/bash par exemple) ne pourra pas les exécuter :

Le fichier au format Windows non converti au format Unix fera apparaitre des caractères ^M (ASCII=\x0D$)si vous l'ouvrez dans un éditeur (vi, vim, nano, gedit, ..). Il faut donc convertir les fichiers vers le format UNIX de la manière suivante :

Code :
find /chemin/vers/mon/repertoire/de/fichiersWindoz/ -type f -exec sed -i -e "s/\r$//" {} \;
Vérification que les caractères de fin de ligne ont bien été converti :
Code :
cat -Ev <mon_fichier_converti_au_format_UNIX>
ou plus simple :
Code :
cat -e <mon_fichier_converti_au_format_UNIX>
Note 1: cela n'est a priori pas nécessaire si vous copiez/collez un code écrit sous Windows dans un éditeur Linux. La conversion se fait à la volée par l'éditeur dans le cas de gedit par exemple. Par contre, il faut convertir les formats pour des fichiers transférés par copie de fichiers.

EDIT:
Note2: Il existe aussi le paquet dos2unix sur les principales distributions, mais ça impose d'ajouter un paquet supplémentaire, pas forcément utile sur une machine vouée à la production par exemple.
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/02/2011, 22h35   #2
lavazavio
Rédacteur/Modérateur
 
Avatar de lavazavio
 
Homme
Inscription : décembre 2004
Messages : 1 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2004
Messages : 1 668
Points : 2 427
Points : 2 427
Sinon, il existe l'outil dos2unix, contenu dans le package tofrodos sous Debian et Debian-Like.

Prenons le fichier foo.txt avec les fameux ^M en fin de ligne.
Pour le convertir au format linux :
Code :
dos2unix foo.txt bar.txt
__________________
Rédacteur et Modérateur rubrique Linux
Articles dvp.com
Man pages en français
lavazavio est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/02/2011, 22h43   #3
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
Merci.
Oui mais tout le monde n'a pas Debian/Ubuntu. Mais je peux effectivement l'ajouter en commentaire.
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 28/02/2011, 22h59   #4
N_BaH
Modérateur
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 756
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 756
Points : 6 622
Points : 6 622
Bonjour,

sed -ie signifie qu'une sauvegarde nommée fichiere sera créée !
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/02/2011, 23h04   #5
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
merci, tipo corrigée
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/02/2011, 23h13   #6
lavazavio
Rédacteur/Modérateur
 
Avatar de lavazavio
 
Homme
Inscription : décembre 2004
Messages : 1 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2004
Messages : 1 668
Points : 2 427
Points : 2 427
- Avec awk :
Code :
awk '{ sub("\r$", ""); print }' $1 > $2
- Avec tr :
Code :
cat $1 | tr -d '\r' >$2
- Avec perl :
__________________
Rédacteur et Modérateur rubrique Linux
Articles dvp.com
Man pages en français
lavazavio est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/02/2011, 23h39   #7
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
oui, effectivement, les solutions sont très nombreuses.

pas vérifié mais ça devrait aussi le faire :
Code :
awk -F= '{gsub("\r$","",$1)}1' OFS="=" mon_fichier
mais il me semble que awk est plus difficile à appréhender que sed. Pour moi en ts cas. Et la solution Perl peut-elle convenir dans cette FAQ, alors que la FAQ Perl est bien fournie et comporte déjà ce point ?

Donc je pense me restreindre à une seule solution qui fonctionne, sinon il faut écrire un tuto. Et même remarque, awk est rarement dispo en busybox alors que sed, si.
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/03/2011, 15h29   #8
Alek-C
Membre Expert
 
Homme Alexis
Responsable d'Exploitation
Inscription : février 2003
Messages : 924
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Responsable d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 924
Points : 1 766
Points : 1 766
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
pour des raisons de compatibilité, je trouve que la solution
Code :
tr -d '\r' < fichier1 > fichier2
est la plus pratique non ?

edit: de même, le cat -Ev peut être avantageusement remplacé par cat -e plus universel
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/03/2011, 15h42   #9
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
Citation:
Envoyé par Alek-C Voir le message
pour des raisons de compatibilité, je trouve que la solution
Code :
tr -d '\r' < fichier1 > fichier2
est la plus pratique non ?

edit: de même, le cat -Ev peut être avantageusement remplacé par cat -e plus universel
tr:
Oui je suis d'accord, plus pratique et plus élégant aussi. Et donc, tu l'intègres comment ta redirection dans un find ?

cat:
le man dit que les 2 sont strictement équivalents et ne parle pas d'obsolescence de l'un par rapport à l'autre. Donc je préfère la solution "lisible". Un coup de man, et le lecteur comprend tout de suite à quoi servent les options. Mais là, c'est du chipotage :-)
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/03/2011, 16h04   #10
Alek-C
Membre Expert
 
Homme Alexis
Responsable d'Exploitation
Inscription : février 2003
Messages : 924
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Responsable d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 924
Points : 1 766
Points : 1 766
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par hornetbzz Voir le message
tr:
Oui je suis d'accord, plus pratique et plus élégant aussi. Et donc, tu l'intègres comment ta redirection dans un find ?

cat:
le man dit que les 2 sont strictement équivalents et ne parle pas d'obsolescence de l'un par rapport à l'autre. Donc je préfère la solution "lisible". Un coup de man, et le lecteur comprend tout de suite à quoi servent les options. Mais là, c'est du chipotage :-)
Etant arrivé en cours de route, j'avais zappé le find du début et je répondais plus par rapport aux propositions de lavazavio
Avec find, le sed est naturellement plus adapté (Mais est-ce que le g est bien nécessaire ?! Tu n'auras jamais qu'un seul \r$ par ligne normalement non ?).

Pour ce qui est des histoires d'options, le problème, c'est que beaucoup de gens passent ici mais travaillent sur des machines sous Unix où un bon paquet de paramètres n'existent pas (comme -E pour cat, -i pour sed,...), c'est pour ça que je fais la remarque. Et je pense que l'option -e est plus utile que -E mais bon...
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/03/2011, 16h27   #11
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
Merci

Effectivement l'option "g" ne sert à rien ici.
Pour le cat, il suffit de mettre les deux versions, j'édite comme ça.
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/03/2011, 16h32   #12
zipe31
Expert Confirmé Sénior
 
Inscription : janvier 2011
Messages : 1 454
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 1 454
Points : 4 449
Points : 4 449
Salut,

Pour la portabilité il serait peut être bon d'ajouter :

Le ^M s'obtenant par la séquence de touches "CTRL-V" + "CTRL-M".

De même sous GNU-sed la notation ASCII est aussi possible :

__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 01/03/2011, 17h05   #13
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
merci- ajouté le code ASCII.
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/03/2011, 12h34   #14
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 573
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 573
Points : 31 503
Points : 31 503
http://perl.developpez.com/sources/?...chier#dos2unix
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/03/2011, 01h28   #15
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
Ok, quand je pourrai éditer, j'ajouterai aussi cette possibilité.
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 23h10   #16
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
Bon voila, merci pour les commentaires que j'ai récapitulés pour la proposition d'ajout à la FAQ:
-----------------------------------------------------------------------
Windows et Unix ont des caractères de fin de ligne différents. En cas d'import de fichiers texte (y compris des scripts bash par exemple), il faut les convertir au format Unix sans quoi l'interpréteur (/bin/sh ou /bin/bash par exemple) ne pourra pas les exécuter ou risque de mener à des résultats étranges et venus d'ailleurs - je plaisante -, en tous cas, des erreurs difficiles à tracer :

Le fichier au format Windows non converti au format Unix fera apparaitre des caractères ^M si vous l'ouvrez dans un éditeur (vi, vim, nano, gedit, ..).

Remarque: Ce caractère "^M" s'obtient par la combinaison de touches "CTRL-V" + "CTRL-M". Le code ASCII du caractère "^M" est \x0D$.


Voici un panel de solutions possibles :

# commande GNU-sed (SOLUTION PORTABLE)
Code :
find /home -type f -name "*.ext" -exec sed -i -e 's/^M$//' {} \;
# commande GNU-sed
Code :
find /home -type f -name "*.ext" -exec sed -i -e "s/\x0D$//g" {} \;
# commande SED pour les distributions relativement récentes
Code :
find /home -type f -name "*.ext" -exec sed -i -e "s/\r$//g" {} \;
# DOS2UNIX (un simple "apt-get" à mener dans les distros de type Debian)
Code :
find /home -type f -name "*.ext" -print0 | while read -r -d "$(printf "\000")" -r path; do dos2unix $path $path"_new"; done
# commande AWK
Code :
find /home -type f -name "*.ext" -print0 | while read -r -d "$(printf "\000")" -r path; do awk '{ sub("\r$", ""); print }' $path > $path"_new"; done
# commande TR
Code :
 find /home -type f -name "*.ext" -print0 | while read -r -d "$(printf "\000")" -r path; do cat $path | tr -d '\r' > $path"_new"; done
# PERL
Code :
 find /home -type f -name "*.ext" -exec perl -pi -e 's/\r//g' {} \;
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 30
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h06.


 
 
 
 
Partenaires

Hébergement Web