Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 18 sur 18
  1. #1
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    Par défaut Comment convertir des fichiers texte Windows vers Unix

    Bonjour,

    C'est une 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 :

    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.

  2. #2
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    décembre 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : décembre 2004
    Messages : 1 675
    Points : 2 271
    Points
    2 271

    Par défaut

    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

  3. #3
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    Par défaut

    Merci.
    Oui mais tout le monde n'a pas Debian/Ubuntu. Mais je peux effectivement l'ajouter en commentaire.

  4. #4
    Modérateur
    Avatar de N_BaH
    Inscrit en
    février 2008
    Messages
    3 428
    Détails du profil
    Informations forums :
    Inscription : février 2008
    Messages : 3 428
    Points : 8 165
    Points
    8 165

    Par défaut

    Bonjour,

    sed -ie signifie qu'une sauvegarde nommée fichiere sera créée !

  5. #5
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    Par défaut

    merci, tipo corrigée

  6. #6
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    décembre 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : décembre 2004
    Messages : 1 675
    Points : 2 271
    Points
    2 271

    Par défaut

    - 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

  7. #7
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    Par défaut

    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.

  8. #8
    Membre Expert
    Homme Profil pro Alexis
    Responsable d'Exploitation
    Inscrit en
    février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexis
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : février 2003
    Messages : 926
    Points : 1 567
    Points
    1 567

    Par défaut

    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

  9. #9
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    Par défaut

    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 :-)

  10. #10
    Membre Expert
    Homme Profil pro Alexis
    Responsable d'Exploitation
    Inscrit en
    février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexis
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : février 2003
    Messages : 926
    Points : 1 567
    Points
    1 567

    Par défaut

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

  11. #11
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    Par défaut

    Merci

    Effectivement l'option "g" ne sert à rien ici.
    Pour le cat, il suffit de mettre les deux versions, j'édite comme ça.

  12. #12
    Expert Confirmé Sénior
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 693
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 693
    Points : 4 819
    Points
    4 819

    Par défaut

    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.

  13. #13
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    Par défaut

    merci- ajouté le code ASCII.

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    16 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 16 486
    Points : 465 192
    Points
    465 192

    Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !

  15. #15
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    Par défaut

    Ok, quand je pourrai éditer, j'ajouterai aussi cette possibilité.

  16. #16
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    Par défaut

    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' {} \;

  17. #17
    Responsable Modération

    Avatar de ok.Idriss
    Homme Profil pro Idriss Neumann
    Consultant en SSII et ingénieur CNAM Paris (spécialité SI)
    Inscrit en
    février 2009
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Nom : Homme Idriss Neumann
    Âge : 23
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant en SSII et ingénieur CNAM Paris (spécialité SI)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2009
    Messages : 4 904
    Points : 16 736
    Points
    16 736

    Par défaut

    Bonsoir.

    Une nouvelle Q/R a été rédigée en fonction des remarques faites dans ce thread : Comment convertir des fichiers texte Windows vers Unix ?

    J'ai un peu moins insisté sur le find ou je n'ai mis qu'un seul exemple (savoir parcourir une liste de fichiers n'étant pas l'objet de cette Q/R).

    à tous.

    Idriss
    mes cours sur DVP | initiation aux bases de données relationnelles | FAQ Linux | FAQ tests
    la programmation Shell | bonnes pratiques Bash | exercices shells scripts & Bash corrigés
    Merci aussi de lire les règles du club

    "Forgiveness does not change the past, but it does enlarge the future." (Paul Boese)
    Traduction approximative : le pardon ne change pas le passé mais élargit l'horizon de l'avenir.

  18. #18
    Futur Membre du Club
    Homme Profil pro Chris Rakotovao
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Nom : Homme Chris Rakotovao
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : mai 2008
    Messages : 18
    Points : 16
    Points
    16

    Par défaut Et pour l'inverse

    Bonjour,

    Je sais que la discussion date, néanmoins, je voulais savoir si quelqu'un connait la fonction inverse, c'est à dire convertir des fichiers unix en text windows.

    je m'explique :
    Mon problème c'est que je sors des fichiers avec des champs délimités extraits d'une base tournant sur unix, en exportant les fichiers par ftp, je dois compresser avec un tar gz, lorsque les utilisateurs essayent d'ouvrir les fichiers avec bloc note ou autre, la délimitation n'est plus respecté, sauf s'il l'ouvre TEXTPAD par exemple et enregistre le fichier sous format PC au lieu de UNIX.

    Merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •