Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 sad<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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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]> » wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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