|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : septembre 2006 Messages : 105 ![]() |
Bonjour,
je continue dans mes question de débutants Lorsque j'appelle une url dans mon script (via curl) elle me renvoit un message xml. Dans ce xml, j'aimerais récup une infos, plus précisement la valeur entre <id>toto</id> pour que je puisse l'utiliser dans la suite de mon script J'ai cherché un peu, je suis tombé sur sed mais je trouve ça très complexe au premier abord (et j'ai pas trop de souci avec les regexp en général). Donc si vous avez la solution ou que vous pouvez me guider... Merci |
|
|
10
|
|
|
#2 |
|
Membre Expert
![]() |
J'ai une réponse de noob, mais il y a sûrement plus propre
-n > pour ne pas afficher les lignes s/.../.../ (s/.*<id>\(\w*\)<\/id>.*/\1/p) > chercher le pattern compris entre les 2 premiers slashs et le remplace par le contenu entre les 2 derniers slashs .*<id>\(\w*\)<\/id>.* > texte chercher : quelque chose ou pas, suivi de <id>, puis d'un mot (\w est à adapter) (les parenthèses échappées sont uniquement là pour mémoriser cette partie) puis suivi de </id> et d'éventuellement quelque chose \1 > fait référence au premier groupe de parenthèses du pâté (.*<id>\(\w*\)<\/id>.*)précédent p > affiche la ligne correspondante Donc la commande cherche une ligne correspondant à quelque chose ou pas, suivi de <id>, puis d'un mot puis terminé par </id> et éventuellement autre chose. Elle remplace cette ligne par ce qui est entre <id> et </id> et affiche le résultat... |
|
|
20
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : septembre 2006 Messages : 105 ![]() |
Réponse très rapide, merci bien
|
|
|
10
|
|
|
#4 |
|
Membre Expert
![]() |
de rien ^^ tu peux cliquer sur résolu si c'est ok, à moins que tu ne préfères attendre une réponse plus jolie (ce qui devrait être possible
|
|
|
10
|
|
|
#5 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Citation:
Plus jolie peut être pas mais j'ai plus coutume de faire comme suit :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
10
|
|
|
#6 | ||
|
Nouveau Membre du Club
![]() Inscription : septembre 2006 Messages : 105 ![]() |
Je continue avec le sed
Là je cherche à obtenir le nom du rep du fichier (donc 56) : Code :
Et cela ne me renvoi rien donc pas pratique pour trouver l'erreur Une idée ? |
||
|
|
10
|
|
|
#7 |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
Code :
dirname ftp/56/toto.zip | sed 's#.*/##' Sinon, sans sed :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
10
|
|
|
#8 | ||
|
Membre Expert
![]() |
"n'importe quoi" c'est .* et pas * tout seul
* signifie : le caractère précèdent répété 0 ou plusieurs fois . signifie n'importe quel caractère (sauf fin de ligne selon les options) \w correspond à un seul caractère, donc si tu veux pouvoir en capturer plusieurs, il te faut une * derrière : \w* Code :
dirname ftp/56/toto.zip | sed -n 's/.*\/\(\w*\)$/\1/p' Code :
dirname ftp/56/toto.zip | sed 's/.*\///' Code :
dirname ftp/56/toto.zip | sed 's#.*##' Code :
${dossier##*/} > supprime la plus grande partie à gauche de $dossier qui ressemble à */ (n'importe quoi se terminant par slash) |
||
|
|
20
|
|
|
#9 |
|
Nouveau Membre du Club
![]() Inscription : septembre 2006 Messages : 105 ![]() |
Plein de réponses, merci bien
|
|
|
10
|
|
|
#10 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
En fait non, ce n'est pas le caractère précédent répété, mais une séquence de zéro, une ou plusieurs occurrence(s) de l'expression précédente.
Quand tu dis "le caractère précédent répété 0 ou plusieurs fois", cela sous-entends qu'il doit être présent au moins une fois avant (enfin c'est ce que je comprends expliqué comme ça) Citation:
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
20
|
|
|
#11 | ||
|
Membre Expert
![]() |
Merci des précisions
c'est vrai que j'ai cherché à raccourcir un peu trop mes explications et que du coup, ça n'en est pas forcément plus clair Cela dit, je trouve que "une séquence de zéro, une ou plusieurs occurrence(s) de l'expression précédente" peut également prêter à confusion ! une séquence de zéro => 000000 pas facile de définir le * sans exemple en fait... Citation:
Sinon, pour le \w, là, aucun souci : je suis allé au plus court sans rentrer dans les détails, et ta définition est juste (mais ne parle pas forcément à quelqu'un qui ne connaît pas du tout les regexps), donc pour traduire : Citation:
|
||
|
|
20
|
|
|
#12 |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
C'est clair que le plus dur dans les regex tout compte fait, c'est de les expliquer clairement
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
10
|
|
|
#13 |
|
Nouveau Membre du Club
![]() Inscription : septembre 2006 Messages : 105 ![]() |
(re)Bonjour
Est ce que qqun pourrait m'expliquer : sed 's#.*/##' ? Je ne comprend pas les # Et là j'essaye de recupérer le rep précédent et je n'y arrive pas dans /toto/coco/pouet/test.zip, récupérer la valeur de "coco" Merci |
|
|
10
|
|
|
#14 | ||||||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Citation:
Soit on échappe le caractère, mais bien souvent ça devient vite illisible et laborieux, soit on change de caractère séparateur en en choisissant un qui ne soit pas contenu dans le motif à substituer, comme le dièse (#) dans ce cas. Mais on aurait pu mettre n'importe quoi : Code :
Citation:
Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||||||
|
|
20
|
|
|
#15 | ||||
|
Membre Expert
![]() |
Si tu commences à vouloir récupérer des répertoires parents, tu peux aussi réfléchir à utiliser autre chose que sed selon le besoin (awk, cut, perl, ...) parce qu'il y a un moment où la lecture devient ardue comme le montre l'exemple de zipe31
(edit) avec awk, ça donnerait ceci par exemple : Code :
Tu as aussi des fonctions intégrées à bash: Code :
|
||||
|
|
10
|
Copyright © 2000-2012 - www.developpez.com