Parser basique en bash (sed ??)

Parser basique en bash (sed ??) - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 21-01-2009 à 19:04:41    

Salut les gens  :hello:  :bounce:  
 
voila, j'ai un script bash qui lance un command SOAPsh (client webservice soap) et stock le retour dans une variable.
 
Cette variable contient une sorte de xml, un truc qui ressemble à ca:
 

Code :
  1. <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:myselfcare" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
  2.    <SOAP-ENV:Body>
  3.       <ns1:ExecuteCommandResponse>
  4.          <return xsi:type="xsd:string">
  5.             <LICENSE_REQUESTS>
  6.                 <LICENSE> <PK>34</PK>
  7.                 <EMAIL>mail@mail.com<EMAIL>
  8.                 <DATA> ici plein de données intéressantes ....</DATA>
  9.            </LICENSE>
  10.            <LICENSE_REQUESTS>
  11.                 <LICENSE> <PK>35</PK>
  12.                 <EMAIL>mail@mail.fr<EMAIL>
  13.                 <DATA> ici plein de données intéressantes ....</DATA>
  14.            </LICENSE>
  15.        </LICENSE_REQUESTS>
  16.       </return>
  17.       </ns1:ExecuteCommandResponse>
  18.    </SOAP-ENV:Body>
  19. </SOAP-ENV:Envelope>


 
 
Je suis tout jeune "basher" / "bashelier" et surtout tout pas bon en bash, et j'essai de "parser" mon xml pour recupérer le contenu des la balises <PK >, créer des fichiers qui s'appellent $PK_license.txt, et qui contiendraient ce qu'il y a dans les balises <DATA>
 
Je suis sûr que ca se fait en 3 lignes de codes avec 2-3 sed imbiqués ... mais j'y arrive pas.  
J'ai essayé avec des while en parcourant ma chaine de caractères et j'ai perdu 2h de boulot.
 
 
Quelqu'un pourrait-il m'aider?   :??:   :heink:  
 
Meci d'avance. :hello:


Message édité par bakastef le 21-01-2009 à 19:06:46
Reply

Marsh Posté le 21-01-2009 à 19:04:41   

Reply

Marsh Posté le 21-01-2009 à 19:19:34    

utiliser un vrai langage de script serait nettement plus adapté


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 21-01-2009 à 20:16:20    

Tu veux plutot dire "utiliser un vrai langage de programmation"  :D
 
=> Python, Perl, Ruby...


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 21-01-2009 à 22:06:14    

Ben comme j'utilise un client soap que je pilote en bash, et que je me retrouve avec mon XML ds une variable, je me dit que c'est con de développer une appli faites ds un autre langage, pour revenir utiliser le client soap après...
 
Je l'ai pas précisé dans le message initial, mais le but étant de sauver le les données <DATA> dans un fichier, de générer une clé de licence et de la coller dans ces fichiers, à partir d'une appli de cryptage, puis de renvoyer ces licences en soap au serveur qui en a fait la demande.
 
 
De plus en voyant des gars faire en gros ce que je voulais en quelques lignes (exemple http://forum.ubuntu-fr.org/viewtopic.php?id=121833) je me suis dit que ca serait pas mal.


Message édité par bakastef le 21-01-2009 à 22:10:51
Reply

Marsh Posté le 21-01-2009 à 22:21:24    

Le truc c'est que bash pour parser du XML... :/
 
Enfin la c'est pas bien compliqué, mais en SED, si tu ne maitrises pas (ce qui semble etre le cas) le jour ou tu feras evoluer ton script d'un poil, tu perdras encore des heures pour un truc qui aurait été tout con avec un vrai langage :spamafote:


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 21-01-2009 à 22:22:13    

Et je parle meme pas des effets de bord :D


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 22-01-2009 à 09:04:12    

Tu fais une boucle while et pour chaque ligne tu fais un truc du genre :
 

pk=$(echo $line | sed "s/^.*<PK>\(.*\)<\/PK>.*$/\1/" )


Avec $line la variable contenant uniquement la ligne courante, tu auras le résultat dans $pk
 
À toi d'adapter pour data (suffit de remplacer PK par DATA...)

Reply

Marsh Posté le 22-01-2009 à 09:48:17    

Je pencherais plutôt pour du awk si on veut reste dans les commandes système :o
 
cat $fichier  | awk 'BEGIN { F=0 }/<LICENSE>/ { F=1 }/<DATA>/ { if(F==1) print $tesdonnés }'
 
Bon c'est un début après faut repasser la variable F à 0 après </LICENSE> mais là j'ai pas le temps :p


---------------
Il y a trois sortes de mensonges : les mensonges, les gros mensonges et les statistiques !
Reply

Marsh Posté le 22-01-2009 à 09:48:52    

Et si ce qui se trouve dans DATA tient sur plusieurs lignes ? [:cerveau dr]


Message édité par e_esprit le 22-01-2009 à 09:53:43

---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 22-01-2009 à 09:52:35    

C'est pas censé être le cas mais effectivement, on peut faire 2 variable sinon 1 pour LICENSE et l'autre Pour DATA quand les 2 sont à 1 on prends les lignes quand on en passe 1 à 0 on stop :p
 
Mais bon ça reste du bricolage en bash quoi :D


---------------
Il y a trois sortes de mensonges : les mensonges, les gros mensonges et les statistiques !
Reply

Marsh Posté le 22-01-2009 à 09:52:35   

Reply

Marsh Posté le 22-01-2009 à 09:53:31    

Voila, c'est du bricolage :D


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 22-01-2009 à 10:19:09    

Le contenu de <DATA> tiens effectivement sur plusieurs lignes.
Encore un truc qui aide pas :(

Reply

Marsh Posté le 22-01-2009 à 10:36:08    

Python + SAX : ftp://ftp.logilab.org/pub/talks/python-uk-2002.pdf
 
A mon avis c'est pas beaucoup plus complexe à comprendre qu'une ligne de sed :D


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 22-01-2009 à 11:08:53    

ruby + rexml :o


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 22-01-2009 à 11:11:27    

http://hfr-rehost.net/www.ruby-lang.org/images/logo.gif


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 08-02-2009 à 23:01:13    

perl + XML::Simple :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed