[Shell] Lire et écrire dans un fichier

Résolu
Bonjour,

Je cherche a automatiser une mise à jour de fichier.
Je veux donc lire dans un fichier .txt chaque ligne et les concaténer pour les insérer dans une balise bien précise d'un fichier XML.

J'ai un fichier .txt qui contient cela :

Bonjour 
comment 
tu 
vas 
? 


J'aimerai lire dans ce fichier ligne par ligne pour mettre à jour un deuxième fichier ( .xml) pour qu'il ressemble à cela :

... 
... 
<baliseCCM>Bonjour comment tu vas ? </baliseCCM> 


Je n'ai pas l'habitude de manipuler les fichiers en scripts, donc encore moins manipuler leur contenu...
Si quelqu'un veut donc bien m'aider.

7 réponses

  1. Pour lire ton fichier, rien de plus simple, le petit bout de code suivant te permettra d'afficher chaque ligne une par une (ensuite tu mets ce que tu veux à la place du "echo") :

    while read l
    do
    echo $l
    done < monfichier.txt

    Pour ce qui est de l'intégration du texte dans un autre fichier, le mieux serais de faire une seule chaîne avec tes différentes lignes :

    while read l
    do
    machaine=$machaine$l
    done < monfichier.txt

    Ensuite, tu fais ta modification avec un sed par exemple :

    sed 's/<baliseCCM><\/baliseCCM>/<baliseCCM>$machaine<\/baliseCCM>/' mondeuxiemefichier.xml

    En gros tu devrais pouvoir t'en sortir comme ça. Y'a certainement des modification à faire, j'ai pas tester.
    1
    1. En gros la commande sed va te renvoyer ce qui se trouve entre <baliseCCM> et </baliseCCM>. Attention, s'il y a plusieurs fois cette balise dans ton fichier ça risque de faire des trucs bizarres.
      Le p signifie qu'il doit imprimer la valeur qu'il trouve (au lieu de la supprimer par exemple avec d).
      Pour le \1 je t'avoue que je suis pas très sur, il me semble que c'est pour signifier qu'il faut imprimer la première occurrence trouvé par sed, ce qui se trouve dans (.*) dans notre cas. Je suis pas contre quelques explications plus poussées si quelqu'un en a par contre. :)
      Sed est un outil hyper puissant, c'est un peu comme awk, t'as l'impression que tu pourrais faire n'importe quoi avec, mais c'est compliqué à comprendre. Une question d'habitude je suppose.
      1
      1. Merci pour ce début.
        J'ai réussi à concaténer mes lignes dans un seule avec un espace entre chaque

        en revanche j'ai du mal à utiliser sed...

        <baliseCCM>vbkvcbjc jcbvjcbvkbv vjfkxvjcx </baliseCCM>


        Le but est de mettre à jour la ligne comprise entre ces balises, qui n'est généralement pas vide
        0
        1. Effectivement si tu dois mettre à jour la valeur comprise entre tes balises mon exemple ne fonctionne pas. Le mieux serais de récupérer d'abord la valeur, de la concaténer à la nouvelle valeur puis d'utiliser la commande sed que je t'ai donné.

          Tu devrais pouvoir récupérer la valeur avec ça :

          sed -n -r 's%<baliseCCM>(.*)<\/baliseCCM>%\1%p' mondeuxiemefichier.xml

          Je te garantis pas que ça fonctionne du premier coup mais je pense que c'est un bon début.
          0
          1. Voici le début de mon script :

            oldchaine='grep -i domains /cf/conf/config.xml' 
            echo Mon ancienne chaine : $oldchaine 
            
            while read ligne 
            do 
            newchaine=$newchaine$ligne' ' 
            done < /var/db/squidGuard/listeblanche/domains 
            echo 'Ma nouvelle chaine : <domains>'$newchaine'</domains>'


            Le résultat :

            # ./maj.sh 
            Mon ancienne chaine : <domains>google.com google.fr free.fr pagesjaunes.fr ipadsl.net</domains> 
            Ma nouvelle chaine : <domains>google.com google.fr free.fr pagesjaunes.fr ipadsl.net geekzone-clan.org gmail.com </domains>


            L'ancienne chaine provient du fichier config.xml que je veux mettre à jour.
            La nouvelle chaine provient de la concaténation de plusieurs lignes du fichier domains

            Je dois maintenant remplacer l'ancienne par la nouvelle.
            Je vais essayer avec ta commande, mais je ne comprends pas tout (les %1 et le /p)
            J'ai beau avoir la doc de sed sous les yeux c'est assez complexe
            0
            1. Merci pour tes explications.
              Je m'en suis sorti avec les commandes suivantes :

              sed "/.*<baliseCCM>/s|\(.*[^<]*\)<.*|\1 $newchaine<\baliseCCM>|" /mon/fichier.xml > /mon/fichier/result
              mv -f /mon/fichier/result /mon/fichier.xml

              Tout ce qui se trouve entre les balises xml </baliseCCM> est remplacé par la valeur contenu dans la variable $newchaine
              0
              1. Parfait dans ce cas. Bonne continuation.
                0

                Discussions similaires

                question pix mot caché

                7 réponses