IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Insérer un fichier entre des motifs


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Par défaut Insérer un fichier entre des motifs
    (re)Bonjour,

    je sais que c'est pas top d'attaquer du XML avec sed mais je le fais sur un distrib ou il n'y a pas le package xmlstarlet et pas possibilité de l'installer.

    Toujours dans l'optique de manipuler du XML.
    Mon fichier principal es_systems.xml à cette forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?xml version="1.0"?>
    <systemList>
    <system>
        <fullname></fullname>
        <name></name>
        <path></path>
        <extension></extension>
        <command> </command>
        <platform></platform>
        <theme></theme>
        <emulators>
          <emulator name="">
            <cores>
              <core></core>
            </cores>
          </emulator>
        </emulators>
      </system>
     
    </systemList>
    Je souhaiterais insérer dans ce fichier existant le contenu d'un fichier jeux.xml (ayant la même forme que ce qui se trouve entre les balises </system> mais au bon endroit entre les balises
    <systemList>
    </systemList>

    du fichier principal.

    Quelle serait la bonne façon de faire?

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut, perso je ferai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IFS=''
    while read ligne
    do
     echo "${ligne}"
     [[ "${ligne}" == "<systemList>" ]] && cat jeux.xml
    done < es_systems.xml
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IFS=''
    while read ligne
    do
     [[ "${ligne}" == "</systemList>" ]] && cat jeux.xml
     echo "${ligne}"
    done < es_systems.xml
    On peut remplacer == par =~ si jamais il risque d'y avoir des espaces avant ou après le <systemList> mais ça alourdit.

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    en complément une solution en awk, sur le même principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -vfile=jeux.xml 'BEGIN{oldRS=RS;RS="^$";getline data<file;RS=oldRS}/<\/system>/{$0=$0"\n"data}{print}' es_systems.xml

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Par défaut
    Merci à tous les deux pour vos propositions

    hizoka, j'ai ajouté un redirection à la fin si non cela montre le résultat attendu à l'écran sans modifier le fichier original.
    Donc, je rediriges dans un fichier: es_systems_modifie.xml

    Citation Envoyé par hizoka Voir le message
    Salut, perso je ferai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IFS=''
    while read ligne
    do
     echo "${ligne}"
     [[ "${ligne}" == "<systemList>" ]] && cat jeux.xml
    done < es_systems.xml >> es_systems_modifie.xml
    ça marche bien en ajoutant un seul jeux.xml

    Mais si je rejoue le script avec un deuxième fichier, ex jeux_2.xml pour qu'il intégère aussi es_systems.xml, le problème c'est que ça me duplique les balises, j'ai deux fois les balises ouvrantes / fermante principale <systemList></systemList>

    ---

    BufferBob, j'ai également essayé ta proposition à base de AWK mais ça me place le contenu importé depuis le fichier jeux.xml à la suite des balises et non entre.

    <systemList>

    </systemList>

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par ShellNoob Voir le message
    BufferBob, j'ai également essayé ta proposition à base de AWK mais ça me place le contenu importé depuis le fichier jeux.xml à la suite des balises et non entre.
    au temps pour moi j'avais mal compris l'énoncé, il suffit de remplacer /<\/systemList>/ par /<systemList>/ tout simplement.

    hum.. bon si on considère le fichier es_systems.xml correctement indenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?xml version="1.0"?>
    <systemList>
       <system>
          <fullname></fullname>
          <name></name>
          <path></path>
          <extension></extension>
          <command> </command>
          <platform></platform>
          <theme></theme>
          <emulators>
             <emulator name="">
                <cores>
                   <core></core>
                </cores>
             </emulator>
          </emulators>
       </system>
    </systemList>
    et le fichier jeux.xml bidon, indenté pour l'occasion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       <machin>
          TOTO
          POUET
          COINCOIN
       </machin>
    la commande renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0"?>
    <systemList>
       <system>
          <fullname></fullname>
          <name></name>
          <path></path>
          <extension></extension>
          <command> </command>
          <platform></platform>
          <theme></theme>
          <emulators>
             <emulator name="">
                <cores>
                   <core></core>
                </cores>
             </emulator>
          </emulators>
       </system>
       <machin>
          TOTO
          POUET
          COINCOIN
       </machin>
    
    </systemList>
    avec tout en bas un retour chariot parasite avant la balise </systemList>, c'est pas ça le but ?
    c'est entre quelles balises qu'il faut insérer le chose ?

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    au temps pour moi j'avais mal compris l'énoncé, il suffit de remplacer /<\/systemList>/ par /<systemList>/ tout simplement.
    Exact ça fonctionne bien ton AWK sans le /

    Du coup ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -vfile=jeux.xml 'BEGIN{oldRS=RS;RS="^$";getline data<file;RS=oldRS}/<systemList>/{$0=$0"\n"data}{print}' es_systems.xml >> es_systems_modifie.xml
    es_systems.xml -> lu mais non modifié
    es_systems_modifie.xml -> le même avec le contenu du fichier jeux.xml importé de dans

    problème si je relance une deuxième fois la commande mais en remplaçant jeux.xml par jeux_2.xml pour insérer un autre ensemble, cela duplique les balises <systemList></systemList> du fait de le redirection dans le fichier

  7. #7
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par ShellNoob Voir le message
    problème si je relance une deuxième fois la commande mais en remplaçant jeux.xml par jeux_2.xml pour insérer un autre ensemble, cela duplique les balises <systemList></systemList> du fait de le redirection dans le fichier
    j'ai aucun problème de ce type, je vois d'ailleurs pas trop comment ça pourrait arriver :
    Code script.awk : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BEGIN {
       oldRS = RS; RS = "^$"
       getline data < file; RS = oldRS
    }
    /<systemList>/ {
       $0 = $0 "\n" substr(data, 1, length(data) - 1)   # pour éviter le retour chariot parasite, purement esthétique...
    }
    { print }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $ awk -i inplace -vfile=jeux.xml   -f script.awk es_systems.xml
    $ awk -i inplace -vfile=jeux_2.xml -f script.awk es_systems.xml
    $ cat es_systems.xml
    <?xml version="1.0"?>
    <systemList>
       <truc>
          BIDULE
          BOUZIN
       </truc>
       <machin>
          TOTO
          POUET
          COINCOIN
       </machin>
       <system>
          <fullname></fullname>
          <name></name>
          <path></path>
          <extension></extension>
          <command> </command>
          <platform></platform>
          <theme></theme>
          <emulators>
             <emulator name="">
                <cores>
                   <core></core>
                </cores>
             </emulator>
          </emulators>
       </system>
    </systemList>

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/09/2016, 19h31
  2. Partage des fichiers entre projets Eclipse
    Par laura_cornel dans le forum Eclipse Java
    Réponses: 9
    Dernier message: 11/12/2006, 11h52
  3. Réponses: 3
    Dernier message: 17/11/2006, 18h12
  4. transfert d'information entre des fichiers
    Par Amallric dans le forum Langage
    Réponses: 10
    Dernier message: 21/09/2006, 08h50
  5. [win] problème pour partager des fichiers entre 2 pc
    Par goma771 dans le forum Administration
    Réponses: 1
    Dernier message: 01/12/2005, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo