Forum Programmation.shell (sed)(bash)

Posté par  .
Étiquettes : aucune
0
30
mar.
2007
Bonjour, j'ai rapidement écrit cette commande pour remplacer des caractères UTF8 mal convertis par phpdocumentor :


for file in $(find ~/www/public/. -type f); do
sed 's/ä/À/g' < $file > $file.tmp
sed 's/É/É/g' < $file > $file.tmp
sed 's/é/é/g' < $file > $file.tmp
sed 's/è/è/g' < $file > $file.tmp
sed 's/Ã/à/g' < $file > $file.tmp
sed 's/ä/ä/g' < $file > $file.tmp
sed 's/ë/ë/g' < $file > $file.tmp
sed 's/ï/ï/g' < $file > $file.tmp
sed 's/â/â/g' < $file > $file.tmp
sed 's/ê/ê/g' < $file > $file.tmp
echo $file
rm -f $file
mv $file.tmp $file
done



mais ça ne semble pas fonctionner. Quelqu'un pourrait me corriger ? (C'est le premier script shell de ma vie).
  • # Commentaire supprimé

    Posté par  . Évalué à 5.

    Ce commentaire a été supprimé par l’équipe de modération.

  • # et iconv ?

    Posté par  . Évalué à 4.

    je ne réponds pas à la question mais pour les conversions
    utf8->latin1, un ami m'a conseillé (à juste titre) iconv

    iconv -f utf8 -t latin1 fichier
  • # Conversion UTF8 vers iso8859-15

    Posté par  . Évalué à 4.

    Salut,

    Il y a certainement plusieurs remarques à faire concernant ton script.
    Tout d'abord, chaque commande sed prend ton fichier d'entrée ($file) pour convertir un caractère unique et écrire le résultat dans $file.tmp : chaque exécution de sed vient donc écraser le fichier $file.tmp précédemment écrit. Seule la dernière exécution est donc utile (autrement dit, seule la ligne
    "sed 's/ê/ê/g' < $file > $file.tmp"
    sert à quelque chose.

    Ensuite, il faut bien savoir quelle est la locale courante en cours lorsque tu écris/visualises le script en question.

    Quoi qu'il en soit, la meilleure solution pour ce type de conversion est, comme écrit dans les deux commentaires précédents, d'utiliser iconv.
    Mais attention, comme tu veux apparemment convertir de l'utf8 en latin9, la bonne commande est celle de B.franck (la commande de LiNuCe fait la conversion inverse).
    Je te conseille tout de même de prendre comme codage de destination du latin9 (LATIN-9 ou ISO-8859-15) plutôt que du latin1 (ou ISO-8859-1).
    Evidemment, iconv ne fonctionnera que si ton fichier d'entrée est bien en UTF8. S'il y a à l'intérieur un mélange de caractère UTF8 et latin9, le résultat de la conversion avec iconv ne sera pas terrible...

    A+
    JJD
    • [^] # Re: Conversion UTF8 vers iso8859-15

      Posté par  . Évalué à 1.


      Evidemment, iconv ne fonctionnera que si ton fichier d'entrée est bien en UTF8. S'il y a à l'intérieur un mélange de caractère UTF8 et latin9, le résultat de la conversion avec iconv ne sera pas terrible...


      Effectivement, Iconv ne servirait à rien ici, l'encodage spécifié est déjà bon, mais ce sont les caractères lus par PhpDocumentor en ISO (alors qu'ils étaient UTF8) qui figure dans les fichiers, ce sont donc des caractères ISO/latin.

      Le problème est en fait très simple, je veux simplement remplacer les occurences de 'ê' par 'è' par exemple. C'est simple, mais comme c'est mon premier script Shell, je voulais des conseils...
      Déjà merci pour vos réponses, le truc de rééffacer le fichier .tmp à chaque fois, c'est bien bête, j'avais pas vu...
      • [^] # Re: Conversion UTF8 vers iso8859-15

        Posté par  (site web personnel) . Évalué à 1.

        Pour ma part je persiste à penser (à moins d'avoir rater une étape) que iconv est ce qu'il te faut.

        Par rapport à ton script, je fais juste une petite remarque complémentaire (en dehors de l'histoire du fichier écrasé à chaque fois) :

        sed 's/Ã/à/g' < $file > $file.tmp
        sed 's/ä/ä/g' < $file > $file.tmp


        Ce n'est probablement pas ce que tu veux faire : si tu remplaces tous les "Ã" par des "à", alors aucun de tes matching suivants ne fonctionnera : le "à" UTF-8 donne en ISO-88-59-1 "Ã " (note l'espace).

        Mais puisque j'aime bien me répéter, iconv est ton ami.
  • # options sed

    Posté par  . Évalué à 3.

    Tu peux effectuer tous les remplacements en une seule commande en utilisant l'option -e de sed. Avec l'option -i tu édites directement le fichier de départ (il exise aussi une option pour effectuer une sauvegarde de la source) :
     sed  -e 's/ä/À/g' -e 's/ê/ê/g'  -i $file 
    

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.