[shell] Recuperer 1 valeur entre balises xml
Sylvain R.
-
Sylvain R. -
Sylvain R. -
Bonjour, je voudrais par exemple récupérer la chaîne "sip" dans la chaîne "<value><string>sip</string></value>" , et ce en bash, avec sed, awk, peu importe. Le nombre de balises avant et après la chaîne qui m'intéresse est indéterminé, mais au moins égale à 1
Mon idée était de me servir de sed :
echo "<value><string>sip</string></value>" | sed 's/\(<.*>\)\(.*\)\(<.*>\)/\2/g'
Mais cela ne marche que s'il y a une seule balise après la chaîne qui m'intéresse, et je n'arrive pas à changer ma condition pour que ça marche, j'ai un peu tout essayer... sauf le bon truc a priori, ça m'énerve un poil...
Si quelqu'un a une solution, que ce soit en 1 ou plusieurs commandes, peu importe...
Merci d'avance
Mon idée était de me servir de sed :
echo "<value><string>sip</string></value>" | sed 's/\(<.*>\)\(.*\)\(<.*>\)/\2/g'
Mais cela ne marche que s'il y a une seule balise après la chaîne qui m'intéresse, et je n'arrive pas à changer ma condition pour que ça marche, j'ai un peu tout essayer... sauf le bon truc a priori, ça m'énerve un poil...
Si quelqu'un a une solution, que ce soit en 1 ou plusieurs commandes, peu importe...
Merci d'avance
A voir également:
- [shell] Recuperer 1 valeur entre balises xml
- Classic shell - Télécharger - Personnalisation
- Recuperer message whatsapp supprimé - Guide
- Xml viewer - Télécharger - Édition & Programmation
- Récupérer mon compte facebook désactivé - Guide
- Comment recuperer une video sur youtube - Guide
8 réponses
Salut,
essaie
lami20j
essaie
echo "<value><string>sip</string></value>" | sed 's/\(<.*>\)\(.*\)\(<*.*>*\)/\2/g'--
lami20j
Merci, ca marche tout bien ! Que représente le caractère # ?? Et si je veut effectuer le traitement sur un ensemble de lignes, est-ce que ce marchera vu qu'il n'y a pas de caractère / pour separer les différentes champs de substitution, comment mettre /g ??
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
le caractère # c'est un séparateur
s///
s###
c'est pour faciliter l'écriture, en utilisant # tu n'est plus obligé d'echapper les slash (ce qui est égal avec paresse + lisibilité du code :-)) /\/// et avec # donne #/##
la solution de jipicy c'est tout simplement de supprimer les balises au lieu de ta variante qui cherche ce qui est en déhors de balises
toutefois il faut étudier pour les cas plus complexes
le caractère # c'est un séparateur
s///
s###
c'est pour faciliter l'écriture, en utilisant # tu n'est plus obligé d'echapper les slash (ce qui est égal avec paresse + lisibilité du code :-)) /\/// et avec # donne #/##
la solution de jipicy c'est tout simplement de supprimer les balises au lieu de ta variante qui cherche ce qui est en déhors de balises
toutefois il faut étudier pour les cas plus complexes
Salut,
Le "#" est là juste comme caractère de séparation (étant donné que le "/" figure dans le motif, sed laisse le choix du caractère opportun, on aurait tout aussi bien pu choisir un "|" ou un "%", ou tout autre caractère ne figurant pas dans le motif, ceci évite de le protéger par un "\" ).
Le "g" signifie "global", mais uniquement sur la ligne en cours et non sur l'ensemble du fichier. Normalement la commande doit marcher sur plusieurs lignes, mais peut être faudra-t-il sélectionner (par un "/motif/") les lignes devant être traitées...
Donne un exemple de fichier à traiter et ce que tu veux en sortie et on verra d'adapter à ton cas ;-))
Le "#" est là juste comme caractère de séparation (étant donné que le "/" figure dans le motif, sed laisse le choix du caractère opportun, on aurait tout aussi bien pu choisir un "|" ou un "%", ou tout autre caractère ne figurant pas dans le motif, ceci évite de le protéger par un "\" ).
Le "g" signifie "global", mais uniquement sur la ligne en cours et non sur l'ensemble du fichier. Normalement la commande doit marcher sur plusieurs lignes, mais peut être faudra-t-il sélectionner (par un "/motif/") les lignes devant être traitées...
Donne un exemple de fichier à traiter et ce que tu veux en sortie et on verra d'adapter à ton cas ;-))
Le modificateur /g travaille sur une seule ligne et son rôle c'est de modifier toutes les occurences.
Comme je l'ai déjà dit en fonction de la compléxité de ton fichier peut être qu'il faut une autre regex.
Comme je l'ai déjà dit en fonction de la compléxité de ton fichier peut être qu'il faut une autre regex.
ok pour les # et le g, je croyais que c'etait pour tout un fichier. Je vais déjà une sélection des lignes à récupérer :
| egrep "(<name>.*</name>|<value>.*</value>)"
J'ai pas d'exemple de fichier sous la main, je traite le résultat d'un échange xmlrpc, le serveur avec lequel je communique est au boulot. Je verrai lundi si l'expression régulière convient à mes données.
Merci beaucoup en tout cas :)
Bonne soirée et bon week-end
| egrep "(<name>.*</name>|<value>.*</value>)"
J'ai pas d'exemple de fichier sous la main, je traite le résultat d'un échange xmlrpc, le serveur avec lequel je communique est au boulot. Je verrai lundi si l'expression régulière convient à mes données.
Merci beaucoup en tout cas :)
Bonne soirée et bon week-end