OVH Cloud OVH Cloud

Modifier un texte entre des balises

7 réponses
Avatar
Ph. Ivaldi
Bonjour,

Dans un ficher html dont voici un extrait:

<span class="function-name">size</span>(8<span
class="constant">cm</span>,10<span class="constant">cm</span>,<span
class="builtin">false</span>); <span
class="comment-delimiter">//</span><span class="comment">b_keep
</span><span class="comment-delimiter">// </span><span
class="comment">&lt;a
href="http://asymptote.sourceforge.net/"&gt;Asymptote&lt;/a&gt;
</span><span class="comment-delimiter">//</span><span
class="comment">e_keep </span><span class="builtin">import</span> math;
etc...

je voudrais changer tous les "&lt;" et &gt; en "<" et ">" respectivement
qui sont entre les mots "b_keep" et "e_keep" et seulement ceux-là.
Comment faire ?

Mes maigres connaissances me permettent de faire
cat fichier.html | awk -v FS="^Z" "/b_keep/,/e_keep/" | sed "s/&lt;/</g"
mais je ne vois pas quoi faire du résultat; je pars sûrement mal...

Si vous avez une solution en Perl ou en Python je suis preneur mais je
préférerai en Bash.
--
Merci de votre attention,

Philippe Ivaldi.
http://home.tele2.fr/phivaldi/index.html

7 réponses

Avatar
JustMe
Ph. Ivaldi a écrit
Bonjour,

Dans un ficher html dont voici un extrait:

<span class="function-name">size</span>(8<span
class="constant">cm</span>,10<span class="constant">cm</span>,<span
class="builtin">false</span>); <span
class="comment-delimiter">//</span><span class="comment">b_keep
</span><span class="comment-delimiter">// </span><span
class="comment">&lt;a
href="http://asymptote.sourceforge.net/"&gt;Asymptote&lt;/a&gt;
</span><span class="comment-delimiter">//</span><span
class="comment">e_keep </span><span class="builtin">import</span> math;
etc...

je voudrais changer tous les "&lt;" et &gt; en "<" et ">" respectivement
qui sont entre les mots "b_keep" et "e_keep" et seulement ceux-là.
Comment faire ?

Mes maigres connaissances me permettent de faire
cat fichier.html | awk -v FS="^Z" "/b_keep/,/e_keep/" | sed "s/&lt;/</g"
mais je ne vois pas quoi faire du résultat; je pars sûrement mal...

Si vous avez une solution en Perl ou en Python je suis preneur mais je
préférerai en Bash.


pourquoi pas :

sed -e "/b_keep/,/e_keep/s/&lt;/</g" fichier.html

Avatar
Stephane Chazelas
2006-11-17, 16:50(+01), Ph Ivaldi:
[...]
je voudrais changer tous les "&lt;" et &gt; en "<" et ">" respectivement
qui sont entre les mots "b_keep" et "e_keep" et seulement ceux-là.
Comment faire ?
[...]


perl -pe 's,b_keep.*?e_keep,$_=$&;s/&lt;/</g;s/&gt;/>/g;$_,eg'

perl -pe '
s
{
b_keep .*? e_keep
}
{
$_ = $&;
s/&lt;/</g;
s/&gt;/>/g;
$_;
}xeg'

--
stéphane

Avatar
Ph. Ivaldi
Le 17 novembre 2006 à 17h20:47,
JustMe écrivit :

Ph. Ivaldi a écrit
je voudrais changer tous les "&lt;" et &gt; en "<" et ">"
respectivement qui sont entre les mots "b_keep" et "e_keep" et
seulement ceux-là. Comment faire ?



pourquoi pas :

sed -e "/b_keep/,/e_keep/s/&lt;/</g" fichier.html


Parce que je n'utilise "sed" qu'une fois pas an...
après avoir lu http://www.gentoo.org/doc/fr/articles/l-sed1.xml
je comprends mieux.

--
Merci beaucoup,

Philippe Ivaldi.
http://home.tele2.fr/phivaldi/index.html


Avatar
Ph. Ivaldi
Le 17 novembre 2006 à 18h15:57,
Stephane Chazelas écrivit :

2006-11-17, 16:50(+01), Ph Ivaldi:
[...]
je voudrais changer tous les "&lt;" et &gt; en "<" et ">"
respectivement qui sont entre les mots "b_keep" et "e_keep" et
seulement ceux-là. Comment faire ?
[...]


perl -pe 's,b_keep.*?e_keep,$_=$&;s/&lt;/</g;s/&gt;/>/g;$_,eg'

perl -pe '
s
{
b_keep .*? e_keep
}
{
$_ = $&;
s/&lt;/</g;
s/&gt;/>/g;
$_;
}xeg'


Cette solution a l'avantage de fonctionner même si les balises sont sur
la même ligne, ce qui n'est pas le cas en utilisant sed (j'ai mis un bon
moment avant de le comprendre).
En revanche je n'ai pas réussi à modifier le code (que ce soit avec perl
ou avec sed) lorsque la "balise" contient un retour chariot.
Pour être plus précis, j'ai le texte suivant généré par un programme
(donc je ne contrôle pas tout):

blabla &lt;blabla&lg;
<span class="toto">b_keep &lt;blabla blabla
blabla blabla&gt;
e_keep
</span>
blabla <span class="toto">blabla
</span> etc...

et j'aurai voulu obtenir:

blabla &lt;blabla&lg
<blabla blabla
blabla blabla>
blabla <span class="toto">blabla
</span> etc...

Finalement j'ai changer ma façon de placer les balises mais vu le temps
que j'ai passé à cherché, cela m'intéresserait de savoir, si ce n'est
pas trop compliqué, comment l'on procède dans ce cas particulier.
--
Philippe Ivaldi.
http://home.tele2.fr/phivaldi/index.html


Avatar
Marwan Burelle
On Sun, 19 Nov 2006 12:07:33 +0100
Ph. Ivaldi wrote:

Finalement j'ai changer ma façon de placer les balises mais vu le
temps que j'ai passé à cherché, cela m'intéresserait de savoir, si ce
n'est pas trop compliqué, comment l'on procède dans ce cas
particulier.


Dans ce genre de cas, je pense qu'il faut commencer à regarder du côté
des outils plus ou moins spécialisés dans la manipulation des langages
avec balise.

Il y a des modules pour ça (en général un parser qui permet d'obtenir
une représentation sous forme d'arbre du texte avec balise) pour pas
mal de langages de script (perl, python, ...) voir des langages
spécialisés dans le traitement d'XML ou de SGML (donc d'xhtml ou html)
comme XSLT ou CDuce (http://www.cduce.org, oui, c'est de la pub et
alors ;)

--
Ferengi Rule of Acquisition #89:
Ask not what your profits can do for you, but what you can do
for your profits.
-- ST: Legends of the Ferengi

Avatar
Stephane Chazelas
2006-11-19, 12:07(+01), Ph Ivaldi:
Le 17 novembre 2006 à 18h15:57,
Stephane Chazelas écrivit :

2006-11-17, 16:50(+01), Ph Ivaldi:
[...]
je voudrais changer tous les "&lt;" et &gt; en "<" et ">"
respectivement qui sont entre les mots "b_keep" et "e_keep" et
seulement ceux-là. Comment faire ?
[...]


perl -pe 's,b_keep.*?e_keep,$_=$&;s/&lt;/</g;s/&gt;/>/g;$_,eg'
[...]


Cette solution a l'avantage de fonctionner même si les balises sont sur
la même ligne, ce qui n'est pas le cas en utilisant sed (j'ai mis un bon
moment avant de le comprendre).
En revanche je n'ai pas réussi à modifier le code (que ce soit avec perl
ou avec sed) lorsque la "balise" contient un retour chariot.


perl -0777 -pe 's,b_keep.*?e_keep,$_=$&;s/&lt;/</g;s/&gt;/>/g;$_,seg'

--
Stéphane



Avatar
Ph. Ivaldi
Merci à tous.
--
Philippe Ivaldi.
http://home.tele2.fr/phivaldi/index.html