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 :

Bash et parsing XML pour supprimer les balises contenant une chaine


Sujet :

Shell et commandes GNU

  1. #21
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Petite remarque : toutes les choses auxquelles nous avons réagi sont données directement par le site https://www.shellcheck.net/
    Tu copies-colles ton code et tu gagnes du temps.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  2. #22
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Ben comme toujours, quand on n'a pas les vrais fichiers sous les yeux, on fait avec les données fournies et on suppute…

    Donc, peut être qu'il existe des choses (caractères non-imprimables ou autres) qu'on n'a pas prévu.

    Fais un cat -A ton_fichier et vois si entre les balises <contrat…></contrat> apparaissent des trucs bizarres ou autres…
    Et oui, et d'ailleurs, un fichier xml n'a aucune obligation d'avoir des retours à la ligne...
    Cordialement.

  3. #23
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonjour,

    Merci beaucoup.
    J'ai regardé et j'ai rien vu.

    Pour te montrer un exemple un peut plus précis de ce que j'ai (un peu maquillé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <contrat name="CONTRAT_test"><description>contrat CONTRAT_test</description><etatContrat><etat name="toto:etatContrat:test"><description>Test</description></etat></etatContrat><services>
    <service name="InterfaceTest" wsdl="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_test/InfoTest?wsdl" accessPoint="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_Test/InfoTest"><description>Description</description></service></contrat>
    Merci d'avance.

    Marco.

  4. #24
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Forcément, vu comme ça, ça ne peut pas/plus marcher ;-(

    Dans ton exemple primaire, les balises "<contrat>" étaient sur des lignes indépendantes (d'ailleurs "disedorgue" a évoqué à juste titre que le format de fichier xml pouvait ne pas avoir de retour à la ligne).
    Là elles ne le sont plus, donc si tu supprimes la ligne contenant l'IP, tu supprimes aussi la balise fermante "</contrat>" et là ça devient problématique et insolvable avec la/les syntaxe(s) donnée(s) plus haut ;-(
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  5. #25
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Citation Envoyé par cotmar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <contrat name="CONTRAT_test"><description>contrat CONTRAT_test</description><etatContrat><etat name="toto:etatContrat:test"><description>Test</description></etat></etatContrat><services>
    <service name="InterfaceTest" wsdl="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_test/InfoTest?wsdl" accessPoint="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_Test/InfoTest"><description>Description</description></service></contrat>
    Ces 2 lignes ne sont pas valides !!!
    Contrat => services => service <= /service <= /contrat
    Cordialement.

  6. #26
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Désolé Disedorgue. je me suis en effet trompé en récupérant ce bout de mon fichier XML et en le manipulant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...<contrats>
    ...
    <contrat name="CONTRAT_test"><description>contrat CONTRAT_test</description><etatContrat><etat name="toto:etatContrat:test"><description>Test</description></etat></etatContrat><services>
    <service name="InterfaceTest" wsdl="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_test/InfoTest?wsdl" accessPoint="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_Test/InfoTest"><description>Description</description></service>
    </services></contrats>...
    Je n'avais pas coupé au bon endroit.
    En espérant que ça soit un peut plus explicite ?

    Comment faire dans ce cas zipe31 s'il te plaît ?

  7. #27
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Si tu as gnu sed (avec l'option -z) , essaye:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -z 's#<service [^>]*>#\x2&#g;s#</service>#&\x2#g;s#\x2<service[^\x2]*monip[^\x2]*\x2##g;s#<contrat[ >]#\x1&#g;s#</contrat>#&\x1#g;s#\x1<contrat[ >][^\x2]*\x1##g;s#[\x1\x2]##g' fichier.xml
    Cordialement.

  8. #28
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut J'abandonne…
    À chaque fois que tu nous remets un bout de ton fichier, il faut réinventer la roue et tout refaire parce que le code donné ne correspond plus

    Sans compter qu'à chaque fois, il y a des erreurs dans ton fichier (balise <contrat …></contratS>)

    Je passe mon tour
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  9. #29
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Je passe mon tour
    j'ai commencé par ça dès que j'ai vu ça :
    Bash et parsing XML
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #30
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    À sa décharge (et à la mienne), il disait aussi :

    Je dois absolument le faire en Bash car je dois intervenir sur une plateforme où je ne peux pas trop installer de nouvelles choses : donc ne ne me proposez pas de Perl ou de Python s'il vous plaît...
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  11. #31
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    il y a des plateformes sur lesquelles python n'est pas installé ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #32
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Tout dépend de la politique de la boîte… tu peux très bien avoir un environnement restreint.
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  13. #33
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Oui, et surtout pas d'outils qui permet de manipuler des fichiers dans un format imposé...
    Cordialement.

  14. #34
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Moi, je ne me sens pas l'obligation de travailler à la place de Cotmar.

    S'il y a déjà installé des outils xml, on peut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ xmlstarlet select -t -m "/services/contrats/contrat/service" -v "@url" -n afac_xml.xml
    http://monip1
    http://monip2
    http://monip2
    http://monip2
    http://monip1
    http://monip2
    http://monip3
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  15. #35
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Moi, je ne me sens pas l'obligation de travailler à la place de Cotmar.
    Je n'en demande pas autant... on croirai que tu m'accuses d'avoir un poil dans la main et si je reviens sur d'autres posts, ce n'est pas la première fois. Si je viens sur un forum c'est pour y chercher de l'aide après avoir déjà cherché de mon côté et tenté de trouver sans succès, mais jamais avant.

    Je précise aussi que si j'ai pris le temps d'écrire une présentation aussi longue au départ c'est précisément pour donner les pistes que j'ai suivi, montrer à quel endroit j'en suis (aussi montrer ma bonne foi) et expliquer ce qui cloche et pourquoi je coince. Là dessus, vous en savez tous largement plus que moi et je remercie tous ceux qui acceptent de m'aider. Votre titre d'experts n'est en rien usurpé.

    Bonne soirée,
    Marco.

  16. #36
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonjour,

    J'ai continué de mon côté en intégrant vos remarques et en particulier la commande xmlstarlet. Pas évident, mais ouf ça se fait petit à petit :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #!/bin/bash
     
    #-----------------------------------------------------------------------
    # Mapping des fichiers ".xml"
    # Pour convertir les adresses de prod en adresses de test
    # Exemple de exemple.CSV :
            #xxx.xxx.xxx.xx1:zzz;aaa.aaa.aaa.bb1:ccc
            #xxx.xxx.xxx.xx2:zzz;aaa.aaa.aaa.bb2:ccc
            #xxx.xxx.xxx.xx3:yyy;aaa.aaa.aaa.bb3:ddd
            #xxx.xxx.xxx.xx4:zzz;aaa.aaa.aaa.bb4:ccc
            #xxx.xxx.xxx.xx5:zzz;suppr 	=> Pour marquer la/les ligne(s) à supprimer
    #-----------------------------------------------------------------------
     
    #-----------------------------------------------------------------------
    # Gestion d’erreurs
    #-----------------------------------------------------------------------
    usage()
    {
            echo "$1"
            echo "Usage :
            $0 ficher_de_mapping.txt fichierRecu.xml
     
            Pour supprimer une ligne du fichier veuillez insérer la ligne suivante dans le fichier de mapping : IP_origine:suppr
            Les autres lignes devront etre selon le modèle : IP_origine;IP_destination
            "
            exit $2
    }
     
    #-----------------------------------------------------------------------
    # Programme principal
    #-----------------------------------------------------------------------
     
    # Date du jour pour historiser la version du fichier
    dateSys=$(date '+%Y-%m-%d')
     
    if [ "$#" -ne "2" ]
    then
            usage "Nombre d arguments invalide : " 80
    else
            [ -f "$1" ] || usage "Le premier argument n est pas un fichier" 81
            [ -f "$2" ] || usage "Le second argument n est pas un fichier" 82
     
            # Copie de sécurité du fichier à modifier
            cp $2 $2.old
     
            # Remplacement
            while read line
            do
    			original="$(echo $line | cut -d\; -f1)"
    			new="$(echo $line | cut -d\; -f2)"
    			sed -i -e "s/${original}/${new}/g" $2
            done < $1
     
            # Pour supprimer les lignes sélectionnées au premier tour
    		monNoeud = $(xmlstarlet select -t -m "/services-logiciel/mas/contrats/contrat/services/service"  -v "@wsdl" -n $2 | grep suppr)
     
    		if [ "$monNoeud" -e "suppr" ]
    		then
    		#La suppression en fonction du contenu de la variable
    			xmlstarlet ed -d "/services-logiciel/mas/contrats/contrat/services/service [@wsdl='${monNoeud}']" $2 > $2
    		fi
     
    		#ToDo : La possibilité que l'on doive supprimer plusieurs serveurs ???
    fi
     
    #-----------------------------------------------------------------------
    # Fin
    #-----------------------------------------------------------------------
     
    exit 0
    Merci et comme toujours, si jamais vous avez des remarques, surtout n'hésitez pas. Désolé aussi pour la longueur de ce sujet...

    Cordialement,
    Marco.

Discussions similaires

  1. [RegEx] Regex pour supprimer les balises <input>
    Par chris0938 dans le forum Langage
    Réponses: 4
    Dernier message: 07/06/2010, 16h07
  2. Macro pour supprimer les lettres d'une cellule?
    Par LittleSun dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/01/2010, 19h56
  3. pour supprimer les doublons d'une table qcq
    Par lamjed dans le forum Oracle
    Réponses: 7
    Dernier message: 19/12/2008, 16h42
  4. [RegEx] probleme de reference arrière pour supprimer les balises html
    Par Galeenet dans le forum Langage
    Réponses: 1
    Dernier message: 16/10/2007, 23h02
  5. Réponses: 12
    Dernier message: 04/03/2007, 11h43

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