OVH Cloud OVH Cloud

Aide pour Regexp

8 réponses
Avatar
Jacques Lav!gnotte - Drop Dr NO when replying
Bonjour,

J'ai des pages HTML dans lesquelles l'hébergeur au collé du JS avant le
<HTML> ansi qu'après le </HTML>

je voudrais bien une moulinette qui va ne garder que le code qui se
trouve entre les deux balises.

Je pense qu'un sed -e 'expr' < fic1 > fic2 pourrait faire ça
mais j'échoue à trouver ce que contiendrait 'expr'

Qui veut m'aider ? Merci

Jacques

8 réponses

Avatar
Stephane Chazelas
2008-04-11, 10:58(+02), Jacques Lav!gnotte:
[...]
J'ai des pages HTML dans lesquelles l'hébergeur au collé du JS avant le
<HTML> ansi qu'après le </HTML>

je voudrais bien une moulinette qui va ne garder que le code qui se
trouve entre les deux balises.

Je pense qu'un sed -e 'expr' < fic1 > fic2 pourrait faire ça
mais j'échoue à trouver ce que contiendrait 'expr'
[...]


sed '
/<[hH][tT][hM][lL]>/,/</[hH][tT][mM][lL]>/!d
s/.*(<[hH][tT][hM][lL]>)/1/
s/(</[hH][tT][mM][lL]>).*/1/'

Ou:

perl -0777 -pe 's{^.*?(<html>.*</html>).*}{$1}'

--
Stéphane

Avatar
Olivier Miakinen
Le 11/04/2008 11:40, Stephane Chazelas répondait à Jacques Lav!gnotte :

J'ai des pages HTML dans lesquelles l'hébergeur au collé du JS avant le
<HTML> ansi qu'après le </HTML>

je voudrais bien une moulinette qui va ne garder que le code qui se
trouve entre les deux balises.


sed '
/<[hH][tT][hM][lL]>/,/</[hH][tT][mM][lL]>/!d


Tiens, je ne connaissais pas cet emploi du « ! ». Je suppose qu'il va
inverser la sélection (donc les lignes qui ne sont *pas* celles allant
de <html> à </html>) avant d'effectuer la commande d.

s/.*(<[hH][tT][hM][lL]>)/1/
s/(</[hH][tT][mM][lL]>).*/1/'


C'est plus sûr en effet, mais il y a des chances que l'hébergeur ne
rajoute que des lignes complètes, auquel cas il est inutile de nettoyer
les caractères qui se trouveraient devant <html> ou derrière </html>.

Ou:

perl -0777 -pe 's{^.*?(<html>.*</html>).*}{$1}'


Jolie pub pour l'emploi de perl au lieu de sed. ;-)


Avatar
Olivier Miakinen

sed '
/<[hH][tT][hM][lL]>/,/</[hH][tT][mM][lL]>/!d


Juste pour être sûr : si jamais il était possible d'avoir plusieurs
<html> et plusieurs </html> dans le même code, sed prendrait comme
point de départ le premier <html> du fichier et comme point d'arrivée
le premier </html> suivant le point de départ, c'est bien ça ?

Par exemple, dans le texte suivant, la sélection irait bien de la
ligne 2 à la ligne 4 ?

1. </html>
2. <html>
3. <html>
4. </html>
5. <html>
6. </html>

Avatar
Stephane Chazelas
2008-04-11, 13:03(+02), Olivier Miakinen:

sed '
/<[hH][tT][hM][lL]>/,/</[hH][tT][mM][lL]>/!d


Juste pour être sûr : si jamais il était possible d'avoir plusieurs
<html> et plusieurs </html> dans le même code, sed prendrait comme
point de départ le premier <html> du fichier et comme point d'arrivée
le premier </html> suivant le point de départ, c'est bien ça ?

Par exemple, dans le texte suivant, la sélection irait bien de la
ligne 2 à la ligne 4 ?

1. </html>
2. <html>
3. <html>
4. </html>
5. <html>
6. </html>


En fait de chaque <html> au </html> suivant (pas sur la meme
ligne).

Et s'il n'y a pas de </html>, de <html> a la fin du fichier.

Dans l'exemple, ca retournerait 2,3,4,5,6 (2-4 et 5-6).

On peut aussi faire:

sed '
1,/</html>/!d
/<html>/,$!d'

A condition que "</html>" ne soit pas sur la premiere ligne.

--
Stéphane


Avatar
Olivier Miakinen

Juste pour être sûr : si jamais il était possible d'avoir plusieurs
<html> et plusieurs </html> dans le même code, sed prendrait comme
point de départ le premier <html> du fichier et comme point d'arrivée
le premier </html> suivant le point de départ, c'est bien ça ?

[...]


En fait de chaque <html> au </html> suivant (pas sur la meme
ligne).

Et s'il n'y a pas de </html>, de <html> a la fin du fichier.

[...]


Très intéressant ! Du coup sed devient un peu moins nul que je croyais
par rapport à perl... ;-)

On peut aussi faire:

sed '
1,/</html>/!d
/<html>/,$!d'

A condition que "</html>" ne soit pas sur la premiere ligne.


Mais là, comment se comportera-t-il s'il y a plusieurs séquences <html>
... </html> ?

Par exemple, avec :

1. des choses
2. <html>
3. code 1
4. </html>
5. des trucs
6. <html>
7. code 2
8. </html>
9. des bidules

Il laissera :

2. <html>
3. code 1
4. </html>
5. des trucs
6. <html>
7. code 2
8. </html>

ou :

2. <html>
3. code 1
4. </html>

ou :

6. <html>
7. code 2
8. </html>

ou encore :

2. <html>
3. code 1
4. </html>
6. <html>
7. code 2
8. </html>

?


Avatar
Stephane Chazelas
2008-04-11, 14:42(+02), Olivier Miakinen:
[...]
sed '
1,/</html>/!d
/<html>/,$!d'

A condition que "</html>" ne soit pas sur la premiere ligne.


Mais là, comment se comportera-t-il s'il y a plusieurs séquences <html>
... </html> ?
[...]


sed, c'est pas compliqué. Dans address1,address2, sed leve un
drapeau quand il atteint address1 et le rabaisse (apres le
processing de la ligne) quand il trouve address2. Et l'action
correspondante est executee quand le drapeau est haut (ou bas
avec !).

1,/</html>, le drapeau est up des la premiere ligne et est
rabaissé au premier </html>.

/<html>/,$, le drapeau est levé au premier <html>

Attention, si tu fais:

sed '
/<html>/,$!d
1,/</html>/!d'

L'addresse 1 ne sera jamais trouvee si <html> n'est pas sur la
premiere ligne, donc la second expression ne matchera pas.

--
Stéphane


Avatar
Jacques Lav!gnotte - Drop Dr NO when replying

[...]
2008-04-11, 10:58(+02), Jacques Lav!gnotte:
[...]


Merci c'est parfait pour moi,


Jacques

Avatar
Olivier Miakinen

sed, c'est pas compliqué.


C'est vrai. Simplement je ne m'étais jamais penché sur la syntaxe
/regexp1/,/regexp2/. Encore merci pour toutes tes explications.