OVH Cloud OVH Cloud

équivalent de :g//

2 réponses
Avatar
Julien SCORDIA
Bonjour à tous,

Examinez le texte suivant:

$ echo -e "<p><pre>\n<p>\ncoco</p></pre></p>" > coucou.txt
$ cat coucou.txt
<p><pre>
<p>
coco</p></pre></p>

Mon but est d'enlever toutes les balises <p> et </p> entre les balises <pre>
et </pre>, de telle manière à obtenir au final:

<p><pre>
coco
</pre></p>

Comment procéder?
J'ai déjà modifié des fichiers en utilisant l'option en ligne de commande
-0777 de Perl, avec le modificateur s pour une commande de substitution (de
manière à ce que . puisse représenter également un caractère de fin de
ligne).
Mais là, c'est une autre affaire, cela revient à détecter un motif
multi-ligne, et à appliquer sur les lignes en question une commande (ici de
suppression de <p> ou </p>).

Dans vim, il y a la commande g qui fait des choses, mais je ne sais pas
travailler en multi-ligne dans vim:

g+<\(pre\|/pre\)>+s/<p>/<a>/
(change les balises <p> en <a> si la balise <pre> ou </pre> a été trouvée
sur la même ligne).

Merci d'avance pour votre aide,

Julien
--
A world without walls needs neither Windows nor Gates.

2 réponses

Avatar
DominiX
ici même:Julien SCORDIA a écrit
Bonjour à tous,

Examinez le texte suivant:

$ echo -e "<p><pre>n<p>ncoco</p></pre></p>" > coucou.txt
$ cat coucou.txt
<p><pre>
<p>
coco</p></pre></p>

Mon but est d'enlever toutes les balises <p> et </p> entre les
balises <pre> et </pre>, de telle manière à obtenir au final:



pour des cas pareil j'utilise
HTML::TokeParser::Simple
le HTML c'est imparsable par de expression rationnelle.


Merci d'avance pour votre aide,

Julien


-- dominix

Avatar
Marc chantreux
Julien SCORDIA wrote:

g+<(pre|/pre)>+s/<p>/<a>/
(change les balises <p> en <a> si la balise <pre> ou </pre> a été trouvée
sur la même ligne).


Je te conseille, comme l'a fait dominix, d'utiliser un parser HTML :
c'est fait pour ca, donc ca le fait mieux.

Maintenant pour répondre a ta question :

perl -pi -e's#<p>#</a>#g if m(</?pre>)';