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 POSIX Discussion :

Comment récupérer la valeur d un attribut dans un XML [SH]


Sujet :

Shell et commandes POSIX

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Comment récupérer la valeur d un attribut dans un XML
    Bonjour,

    Dans un script shell je souhaite parser un xml et remplacer la valeur d un attribut par un autre:
    voici le contenu du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <start id="1" name="application" version="1.2.3.patch">
    objectif: remplacer la version par 1.2.4.patch.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cp -p  truc.xml truc.xml.$(date +%Y%m%d)  && sed  '/<start/ s/version="1.2.3.patch"/version="1.2.4.patch"/' truc.xml.$(date +%Y%m%d) >  truc.xml
    après faut adapter et scripter autour mais ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $ cat > truc.xml
    <start id="1" name="application" version="1.2.3.patch">
    $ cp -p truc.xml truc.xml.$(date +%Y%m%d) && sed  '/<start/ s/version="1.2.3.patch"/version="1.2.4.patch"/' truc.xml.$(date +%Y%m%d) > truc.xml 
    $ more truc.xml
    <start id="1" name="application" version="1.2.4.patch">
    $ rm truc.xm*
    $
    t'est pas forcement obligé de faire une sauvegarde datée hein... tu vois en fonction de ton besoin....

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Merci pour la reponse. Ca fonctionne.
    Par contre je souhaite modifier la version sans lui indiquer la valeur avant remplacement car j ai plusieur fichier a mettre a jour.

    Est- il possible avec un SED de ne pas lui indiquer la valeur ?

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,

    Oui, avec une expression régulière, voici un exemple (juste pour illustrer la regex pour le sed):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo '<start id="1" name="application" version="1.2.3.patch">' | sed -e 's/\(version="\)[^"]*\("\)/\11.2.4.patch\2/g'
    <start id="1" name="application" version="1.2.4.patch">
    Les '\1' et '\2' sont les références arrières capturées par les '\(...\)'.
    Donc:
    \1 représente ici: version="
    \2 repésente ici: "
    Coté expression régulière, [^"]* veut dire n'importe quel caractère autre que le guillemet '"' 0 à n fois (en sachant, que le moteur de regex essaiera toujours de récupérer la plus grande expression possible qui est vraie).
    Cordialement.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut [Resolu] remplacer la valeur d un attribut dans un xml
    Bonjour disedorgue,

    Merci à vous deux (frp31 et disedorgue).
    J'ai essaye ta solution et cela fonctionne. J'ai juste changé un petit truc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\(version="\)[^"]*patch\("\)/\11.2.4.patch\2/g'
    pour éviter de modier tous les attributs "version" du fichier tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="UTF-8"

    Synthèse:
    Pour remplacer, à partir d un script, la valeur de l attribut "version" dans un fichier XML on peut utiliser la solution suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo '<start id="1" name="application" version="1.2.3.patch">' | sed -e 's/\(version="\)[^"]*\("\)/\11.2.4.patch\2/g'
    <start id="1" name="application" version="1.2.4.patch">

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

Discussions similaires

  1. Comment récupérer la valeur d'un attribut private ?
    Par TocTocKiéLà? dans le forum C++
    Réponses: 2
    Dernier message: 29/07/2007, 11h16
  2. comment récupérer la valeur d'une liste dans un servlet
    Par marwanos dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 11/04/2007, 00h58
  3. Réponses: 4
    Dernier message: 07/08/2006, 17h01
  4. Comment récupérer la valeur d'un dbGrid dans des fenêtres MDI ?
    Par sylvie cl dans le forum Composants VCL
    Réponses: 5
    Dernier message: 19/07/2005, 13h42

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