Pages : 1
#1 Le 10/07/2012, à 17:13
- Gij
recuperer donner avec awk
Bonjour
Je souhaiterais recuperer des donnees entre 3 balises d'un texte.
Ces 3 balises sont situées à endroit précis entre les balises <balise1> </balise1> sachant qu'elles sont à plusieurs endroit.
fichier.txt:
<balise2> txt </balise2>
<balise3> txt </balise3>
<balise4> txt </balise3>
...
<balise1>
<balise2> txt </balise2>
<balise3> txt </balise3>
<balise4> txt </balise3>
...
</balise1>
Ce que j'ai fait
cat fichier.txt | awk '/^<balise1>/ , /^<balise1>/^<\/balise1>.
Comme ceci je récupère tout ce qui est entre mes balises1.
Si j'essaie de faire un sed /<balise2/; </balise2> , j'ai un problème.
Je pense qu'il faudrait plutôt utilise awk avec des begin comme j'ai pu le voir mais je n'arrive pas à faire ce que je veux.
Merci.
Hors ligne
#2 Le 10/07/2012, à 17:43
- toulipe
Re : recuperer donner avec awk
Bonjour,
La solution la plus facile ne serait-elle pas de supprimer toutes les balises, en ayant préalablement extrait ce qu'il y a entre <balise1> et </balise1> ?
Ce n'est cependant pas la méthode la plus productive...
Edit : si les lignes contenant <balise2>, <balise3> et <balise4> se suivent immédiatement, on peut faire, avec pcregrep,
pcregrep -A 3 "<balise2>" fichier
pour récuper les 3 lignes d'un coup ; après, il ne reste plus qu'à supprimer chaque balise en faisant
sed -e "s/<balise>//g"
Dernière modification par toulipe (Le 10/07/2012, à 18:05)
Hors ligne
#3 Le 10/07/2012, à 18:23
- nesthib
Re : recuperer donner avec awk
Si tu ne veux récupérer que le contenu des balises 2, 3 et 4 :
sed -n 's#.*<\(balise[234]\)>\([^<]\+\)</\1>.*#\2#p' fichier
et pour virer les espaces par la même occasion :
sed -n 's#.*<\(balise[234]\)> *\([^<]\*[^ ]\) *</\1>.*#\2#p' fichier
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#4 Le 10/07/2012, à 18:49
- pingouinux
Re : recuperer donner avec awk
Salut,
Si les balises ont des noms quelconques :
$ cat fichier.txt
<balise2> txt2 aaa </balise2>
<balise3> txt3 aaa </balise3>
<balise4> txt4 aaa </balise3>
...
<balise1>
<balise2> txt2 bbb </balise2>
<balise3> txt3 bbb </balise3>
<balise4> txt4 bbb </balise3>
...
</balise1>
$ sed -rn '/<balise1>/,/<\/balise1>/s@</?balise2>|</?balise3>|</?balise4>@@gp' fichier.txt
txt2 bbb
txt3 bbb
txt4 bbb
Hors ligne
#5 Le 10/07/2012, à 18:59
- nesthib
Re : recuperer donner avec awk
@pingouinux : tu peux avantageusement remplacer « </?balise2>|</?balise3>|</?balise4> » par « </?balise[234]> »
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#6 Le 10/07/2012, à 19:07
- pingouinux
Re : recuperer donner avec awk
@nesthib #5 : Bien sûr, mais je pensais que balise1, balise2… étaient des noms génériques, et qu'on pouvait en fait avoir n'importe quoi d'autre.
D'après ce que j'ai compris, Gij ne voulait récupérer que ce qui est entre <balise1> et </balise1>.
Hors ligne
#7 Le 11/07/2012, à 09:44
- Gij
Re : recuperer donner avec awk
Je veux récupérer les balises qui sont situées entre <balise1> et </balise1> car elles existent aussi ailleurs.
Si je fais un grep je récupère donc toutes les autres.
Pour ceci, j'ai donc commencé à faire un awk.
Maintenant il faut traiter ce flux afin de pouvoir sélectionner les lignes en questions: <balise2>; <balise3>; <balise4> afin de récuperer ce qu'il y entre ces balises.
Je pense que je devrais utiliser un BEGIN entre le awkr avec des FS, RS , ... mais je n'y arrive pas.
Hors ligne
#8 Le 11/07/2012, à 09:49
- pingouinux
Re : recuperer donner avec awk
Tu n'as pas dû bien lire les réponses. Que donne le sed que j'indique en #4 ?
Hors ligne
#9 Le 11/07/2012, à 13:32
- Gij
Re : recuperer donner avec awk
Tout d'abord merci.
En fait, je veux récupérer le texte entre chaque balise (balise2, 3, 4) que je mettrais dans des variables.
Pour cela je ferais autant 3 sed.
Du coups les "s@" , "|" "?" dans la commande proposé ne conviennent plus.
Merci.
Hors ligne
#10 Le 11/07/2012, à 14:38
- pingouinux
Re : recuperer donner avec awk
$ cat fichier.txt
<balise2> txt2 aaa </balise2>
<balise3> txt3 aaa </balise3>
<balise4> txt4 aaa </balise3>
...
<balise1>
<balise2> txt2 bbb </balise2>
<balise3> txt3 bbb </balise3>
<balise4> txt4 bbb </balise4>
...
</balise1>
$ var2=$(sed -rn '/<balise1>/,/<\/balise1>/s@</?balise2>@@gp' fichier.txt)
$ var3=$(sed -rn '/<balise1>/,/<\/balise1>/s@</?balise3>@@gp' fichier.txt)
$ var4=$(sed -rn '/<balise1>/,/<\/balise1>/s@</?balise4>@@gp' fichier.txt)
$ echo "$var2"
txt2 bbb
$ echo "$var3"
txt3 bbb
$ echo "$var4"
txt4 bbb
Hors ligne
#11 Le 11/07/2012, à 16:08
- nesthib
Re : recuperer donner avec awk
La solution en sed de pingouinux est à mon avis très bonne, mais si tu insistes pour avoir du awk :
awk 'BEGIN {RS="balise1"} ; { if ($NF == "</") { match($0, /<balise2>(.*)<\/balise2>/, a) ; print a[1] } }' fichier
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#12 Le 13/07/2012, à 14:59
- Gij
Re : recuperer donner avec awk
En essayant la commande sed, on récupère toutes les données entre la <balise1> et </balise1>
La même chose avec awk.
A quoi correspond: "/s@</?balise2>" ==> je suppose que supprimé jusqu'à ?
et @@gp ==> ?
Merci
Hors ligne
#13 Le 13/07/2012, à 17:20
- pingouinux
Re : recuperer donner avec awk
sed -rn '/<balise1>/,/<\/balise1>/s@</?balise2>@@gp'
/<balise1>/,/<\/balise1> : on ne s'intéresse qu'aux lignes comprises entre /<balise1>/ et </balise1>
s@</?balise2>@@gp : c'est la syntaxe s/texte_à_remplacer/texte_qui_remplace/, mais on utilise un autre caractère, car le texte contient /
</?balise2> : soit <balise2>, soit </balise2>, qu'on remplace par une chaîne vide
g : plusieurs remplacements sur une ligne
p : on imprime ce qui reste
Hors ligne
#14 Le 14/07/2012, à 18:09
- Gij
Re : recuperer donner avec awk
Bjr,
Je ne sais pas pourquoi cela ne marche pas.
Je suppose que cela ne devrait pas trop perturber qu'il y est ait plusieurs balise à rechercher entre la balise 1 et la 1er balise à rechercher?
<balise1>
<balise5> txt </balise5>
<balise6> txt </balise6>
....
<balise2> txt </balise2>
<balise3> txt </balise3>
<balise4> txt </balise3>
...
<baliseN> txt </baliseN>
</balise1>
Hors ligne