[shell] Recuperer 1 valeur entre balises xml

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
A voir également:

8 réponses

lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

essaie
echo "<value><string>sip</string></value>" | sed 's/\(<.*>\)\(.*\)\(<*.*>*\)/\2/g' 
--
lami20j
0
Sylvain R.
 
Marche po :/
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,
echo "<value><string>sip</string></value>" | sed 's#</.*##;s#.*>##'
;-))
0
Sylvain R.
 
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 ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
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
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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 ;-))
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
on se complète bien, hein?! :-))
je te laisse la main, c'est toi l'expert.
0
jipicy Messages postés 41342 Statut Modérateur 4 896 > lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité
 
Yes on se complète plus que bien même ;-))

Par contre, tous les avis seront les bienvenus, expert ou pas et je suis loin d'en être un, un passionné tout au plus ;-))
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
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.
0
Sylvain R.
 
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
0