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 :

xmlstarlet : Trouver et remplacer une valeur


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Tofdu31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2016
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2016
    Messages : 93
    Par défaut xmlstarlet : Trouver et remplacer une valeur
    Bonjour tous,

    J'effectue des modifications de fichiers avec xmlstarlet. Script que l'on m'a fourni pour m'aider et j'essaye des apporter des lignes d'actions en plus.

    Je cherche depuis ce matin à modifier une valeur dans un fichier api-manager.xml
    api-manager.xml


    La valeur que je souhaite faire trouver et modifier est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <DASServerURL>{tcp://localhost:7612}</DASServerURL>
    Modifier par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <DASServerURL>{tcp://${iot_hostname}:7612}</DASServerURL>
    En reprenant un bout du script que l'on m'a fait, je n'arrive pas à trouver les bonnes valeurs.
    J'ai mis ceci et ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for file in $(find . -name 'api-manager.xml'); do
        xmlstarlet ed --omit-decl --pf \
            --update '//Analytics[DASServerURL="tcp://localhost:7612"]/APIManager/Analytics/DASServerURL' \
            --value "<DASServerURL>{tcp://${iot_hostname}:7612}</DASServerURL>" \
            ${file} > ${file}.old
     
    done
    Merci pour votre aide

    Edit :

    J'ai essayé aussi ceci mais en vain :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for file in $(find . -name 'api-manager.xml'); do
        xmlstarlet ed --omit-decl --pf \
            --update '//APIManager/Analytics/DASServerURL' \
            --value "<DASServerURL>{tcp://${iot_hostname}:7612}</DASServerURL>" \
            ${file} > ${file}.old
     
    done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    Bonjour,

    pour xmlstarlet, je ne sais pas, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for file in $(find . -name 'api-manager.xml'); do
    c'est NON !

    il est préférable de ne pas boucler avec for sur la sortie d'une substitution de commande, car for ne traite pas des lignes, mais des mots.

    donc, en fonction de l'endroit où peut être trouvé api-manager.xml, ce sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in ./api-manager.xml
    ce qui n'a pas beaucoup de sens !
    mais si tu sais à quel niveau se trouve le fichier tu peux intercaler autant de */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in ./*/*/api-manager.xml
    ou alors, faire appel aux capacités récursives optionnelles de bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    shopt -s globstar nuillglob
    for f in ./**/api-manager.xml
    au pire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ... -print0 | while read -d '' f; do ... done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé Avatar de Tofdu31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2016
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2016
    Messages : 93
    Par défaut
    Ne connaissant pas grand chose au ligne de code, je ne peux pas effectivement trop argumenté. Toutefois, l'autre script est là pour modifier des valeurs dans plusieurs fichiers et ça fonctionne. Voici un extrait :

    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
     
    for file in $(find . -name '*-datasources.xml'); do
        xmlstarlet ed --omit-decl --pf \
            --update '//datasource[name="WSO2_CARBON_DB"]/definition/configuration/url' \
            --value "jdbc:mysql://${db_hostname}:3306/WSO2_CARBON_DB" \
            ${file} > ${file}.new
        xmlstarlet ed --omit-decl --pf \
            --update '//datasource/definition/configuration/driverClassName' \
            --value 'com.mysql.jdbc.Driver' \
            ${file}.new > ${file}
        xmlstarlet ed --omit-decl --pf \
            --update '//username' \
            --value "${db_username}" \
            ${file} > ${file}.new
        xmlstarlet ed --omit-decl --pf \
            --update '//password' \
            --value "${db_password}" \
            ${file}.new > ${file}
    done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    c'est pas parce que ça fonctionne dans un contexte restreint, que c'est correct.
    pour être correct, il faut que ça fonctionne dans tous les contextes, et pour ça on ne boucle pas sur une substitution de commande avec for.

    mais ça ne résout pas ton souci avec xmlstarlet. :/
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Tofdu31 Voir le message
    La valeur que je souhaite faire trouver et modifier est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <DASServerURL>{tcp://localhost:7612}</DASServerURL>
    Modifier par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <DASServerURL>{tcp://${iot_hostname}:7612}</DASServerURL>
    S'il n'y a que ça pour te faire plaisir, je te propose cette version simple (à tester):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name 'api-manager.xml' -execdir sed -e 's|<DASServerURL>{tcp://localhost:7612}</DASServerURL>|<DASServerURL>{tcp://${iot_hostname}:7612}</DASServerURL>|g' {} > {}.old \;

Discussions similaires

  1. Remplacer une valeur <null> par zéro
    Par diablotin dans le forum SQL
    Réponses: 2
    Dernier message: 28/08/2007, 21h07
  2. Remplace une valeur dans une colonne
    Par roger34 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/06/2007, 22h44
  3. [INSERT / UPDATE] Remplacer une valeur vide par NULL
    Par jissay dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 28/09/2006, 14h15
  4. [VBA-E] remplacer une valeur #N/A
    Par aarlock dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/08/2006, 04h13
  5. Réponses: 7
    Dernier message: 27/09/2005, 11h54

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