besoin d'aide sur sed

besoin d'aide sur sed - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 09-07-2009 à 10:18:31    

Bonjour,
 
je suis entrain de modifier un fichier xml avec sed
je voudrai supprimer certaine partie dès quelles contiennent le caractères ?
 
exemple : <blabla>?</blabla>
ça facile j'arrive à le supprimer via : sed -e 's/<.*>\?<\/.*>//g'
 
autre exemple :
 <blabla>?
  <uneSousPartie>toto</uneSousPartie>
 </blabla>
donc la il faudrai que je supprime tout ce que contien blabla
avec sed c'est possible de récupérer le terme "blabla" pour lui dire de tout supprimer jusqu'à ce qu'il trouve "</blabla>"
 
merci


---------------
dam's (debianer), ma galerie Flickr
Reply

Marsh Posté le 09-07-2009 à 10:18:31   

Reply

Marsh Posté le 09-07-2009 à 20:40:14    

Tu as 2 problèmes ici : le pb des parenthèses imbriquées et le problème des lignes multiples.
 
 
La plupart des outils unix, dont sed et les expressions régulières, travaillent sur des lignes de texte (ligne par ligne).
 
On peut mélanger '/toto/ d' (trouver toto et effacer) avec 10,20 d (effacer entre les lignes 10 et 20), ça donne '/begin/,/end/ d' (effacer entre begin et end).
 
Mais ca présente pas mal de danger, il faut que end soit présent après begin, et que ce soit le bon.
 
Les expressions régulières ne sont pas un bon outil pour détecter les ( ) qui matchent (or les balises xml c'est exactement cela, toi tu veux le bon </truc> )... si on veut effacer un truc comme "( ( ( ())) )." (ou son équivalent xml), les expressions comme 's/([ ^I]*)/g' ne vont supprimer que le couple le plus interne (il faudra appeler le script plusieurs fois). Les expressions du genre 's/([ ^I()]*)/g' ne marcheront évidemment pas non plus car on va effacer autre chose que des paires là.
La solution c'est d'utiliser t :

sed '
:again
 s/([ ^I]*)//g
 t again
'


Ici 't again' va réexécuter ce qui se trouve au label ':again' SI la dernière commande de substitution a fait quelque chose au pattern space.
 
 
 
Bref, tout ça pour dire que tu as 2 problèmes (multiples lignes, élements correspondants) que sed et les regexp ne savent pas traiter.


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Sujets relatifs:

Leave a Replay

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