Aide pour Regexp

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Stephane Chazelas
Le #2782611
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{^.*?(
--
Stéphane

Olivier Miakinen
Le #2784261
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{^.*?(

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


Olivier Miakinen
Le #2784251

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>

Stephane Chazelas
Le #2785791
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


Olivier Miakinen
Le #2787231

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>

?


Stephane Chazelas
Le #2787221
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


Jacques Lav!gnotte - Drop Dr NO when replying
Le #2793241

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


Merci c'est parfait pour moi,


Jacques

Olivier Miakinen
Le #2794891

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.

Publicité
Poster une réponse
Anonyme