Sed et substitutions balises html

Résolu
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   -  
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   -
Salut,

je dois louper qquechose avec le texte suivant, dans un fichier html

<head> 
     <title>Titre</title> 
  <link rel="stylesheet" media="screen" type="text/css" title="design" href="design.css" /> 
</head>
<body> 
<h1>Voici les instructions, monsieur X</h1><br /> <br />  <br /> 
<center><img src="images/6.gif" /> Rapport 2.220 <strong>[1]</strong> -02/11/2008- Windows XP <img src="images/6.gif" /></center>  <br />  <br /> 
<center><strong>il est conseillé de suivre la procédure suivante: </center></strong> <br /> <br /> 
<div class="decalage1"><img src="images/1.gif" /> Aller sur ce site <a href="http://www.blabla.html"><em>Nod32</em></a> <br /> 
- Faire ceci, puis cela :  <br /> 
- C:\Program Files\<strong>log.txt</strong></div>
</body>
</html><p> 


je voudrais supprimer tout ce qui est entre <> pour épurer ce fichier html de ses balises et le rendre lisible dans un fichier txt. J'utilise ces expression régulières merdiques

cat Fichier.html | sed 's/<.*>//g;s/<\/.*>//g'


qui donne en conséquence ce résultat merdique :)







il est conseillé de suivre la procédure suivante:

- Faire ceci, puis cela :
- C:\Program Files\


bref, pas mal de texte est zappé. Est-ce que vous auriez plus fin à me proposer ?

Merci
A voir également:

19 réponses

jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,
sed 's|<[^>]*>||g'
;-))
1
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Concernant les délimiteurs, voir Délimiteur de commande dans la FAQ.

Concernant la gourmandise des regex, voir Gourmandise des expressions régulières.

Pour étoffer un peu, les regex sont très gourmandes, si tu mets "<.*>' cela va englober tout ce qui se trouve entre le 1er < et le dernier > sur la ligne.
Avec l'expression "<[^>]*>" on limite la portée au 1er > rencontré, d'où la nécessité de préciser le "g" (global), pour répéter l'expression autant de fois quelle sera rencontrée sur la ligne.
1
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   392
 
Salut,

merci, mais ça ne marche pas : caractère 27: commande `s' inachevée, même avec deux | + combinaison

cat Fichier.html | sed 's|<a *href=\("[^"]"\)>/\1||g;s|<[^>]*>||g'


il n'y a plus les retours lignes et surtout plus aucune URL alors que j'arrive à en récupérer au moins une
1
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   392
 
Merci jipicy ça fonctionne. Je vois que tu as changé les séparateurs, c'est important où c'est pour améliorer la lisibilité ?

Sinon est-ce que tu peuix me dire en quoi ma proposition n'était pas bonne, stp ? visiblement ça ratissait trop large mais j'avoue ne pas très bien saisir pourquoi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Complément d'infos ;-)

[^>] c'est une classe de caractères complémentée qui veut dire "reconnaître un caractère non énuméré" et non "ne pas reconnaître le caractère énuméré"
Le quantificateur * permet de reconnaître zéro fois, une fois ou autant de fois que la classe peut
Dans ce cas même un <> sera supprimé
0
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   392
 
Avec l'expression "<[^>]*>" on limite la portée au 1er 


super, c'est exactement ce que j'avais cherché à faire, sans trouver les bons mot-clés

Merci encore à vous deux pour ces compléments d'info :)
0
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   392
 
Pardon, je reviens un instant vers vous car un pb se pose. Je souhaiterais que sed épargne tous les liens de type

<a href="http://www.URL.htm">


càd le substitue par http://www.URL.htm, sans les guillemets bien entendu

avant d'effectuer ses substitutions. J'ai donc étendu la commande :

cat Fichier.html | sed 's/<a href=\"//g;s/<br \/>/\n/g;s/<[^>]*>//g;s/\">/ /g'


en essayant d'intervertir la position de <a href=\"//g et \">/ /g mais ça ne matche pas à tous les coups (ça supprime quelques URL parfois)

Le but est en priorité de conserver les URL, il faut également substituer les <br /> par des sauts de ligne (d'où le s/<br \/>/\n/g) et ensuite virer tout ce qui est entre crochets

Je précise que le seul unixutil dont je dispose c'est sed, normalement ça se passe sous windows avec sed-3.59.exe (je fais des essais sous Linux dans l'immédiat)
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,


essaie d'abord
sed 's|<a *href=\("[^"]"\)>/\1|g' 
et ensuite
sed 's|<[^>]*>||g'
P.S. Je n'ai pas testé
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Oups, j'ai oublié que le séparateur est |

au lieu de
sed 's|<a *href=\("[^"]"\)>/\1|g' mettre
sed 's|<a *href=\("[^"]"\)>|\1|g' 

0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

Essaye ça :
 sed 's|<br />|\n|g;s|\(<a href=\"\)\([^"]*\)\([^>]>\)|\2 |g;s|<[^>]*>||g' fichier.html
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Pourquoi tu fais autant des captures?!
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896 > lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
 
Parc qu'il faut préserver le reste, on ne veut pas simplement capturer l'URL, mais aussi ce qu'il y a autour en dehors des <.*> ;-))
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
 
Ben, pas toute à fait vu que tu n'utilises que la deuxième références arrière \2
D'où ma question.
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896 > lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
 
Oups t'as raison, avec une ça suffit ;-((

Merchi ;-))
0
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   392
 
cat Fichier.html | sed 's|<a *href=\("[^"]"\)>|\1|g;s|<[^>]*>||g'


non, il me bouffe tous les <a href="http://URL">

mince, c'est pénible... :)
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Mince, j'ai oubilé le quantificateur
Mon expression cherchais seulemetn un caractère
sed 's|<a *href=\("[^"]*"\)>|\1|g' 


Teste la ligne de jipicy.
Au moins il a la possibilité de tester ;-))
0
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   392
 
aucune des solutions ne marche entièrement

jipicy : ta commande me bouffe 1 URL sur deux

celle-là <a href="http://URL.exe"> => OK
celle-ci <a href="http://URL.htm"><em>ICI</em></a> <strong> => n'apparait pas
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
On peut avoir un exemplaire du fichier html s'il te plait ? (au cas ou en MP si problème de droits ou autre...)
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Ben je viens de refaire des tests avec les différentes URL et chez moi ça marche bien :
jp@MDK:~/tmpfs ssh$ cat fichier.html
<head>
     <title>Titre</title>
  <link rel="stylesheet" media="screen" type="text/css" title="design" href="design.css" />
</head>
<body>
<h1>Voici les instructions, monsieur X</h1><br /> <br />  <br />
<center><img src="images/6.gif" /> Rapport 2.220 <strong>[1]</strong> -02/11/2008- Windows XP <img src="images/6.gif" /></center>  <br />  <br />
<center><strong>il est conseillé de suivre la procédure suivante: </center></strong> <br /> <br />
<div class="decalage1"><img src="images/1.gif" /> Aller sur ce site <a href="http://www.blabla.html"><em>Nod32</em></a> <br />
<a href="http://URL.exe">cliquer ici</a><br />
celle-là <a href="http://URL.exe"> => OK</a><br />
celle-ci <a href="http://URL.htm"><em>ICI</em></a> <strong> => n'apparait pas <br />
- Faire ceci, puis cela :  <br />
- C:\Program Files\<strong>log.txt</strong></div>
</body>
</html><p>

jp@MDK:~/tmpfs ssh$ sed 's|<br />|\n|g;s|<a href=\"\([^"]*\)[^>]>|\1 |g;s|<[^>]*>||g' fichier.html

     Titre



Voici les instructions, monsieur X



 Rapport 2.220 [1] -02/11/2008- Windows XP


il est conseillé de suivre la procédure suivante:


 Aller sur ce site http://www.blabla.html Nod32

http://URL.exe cliquer ici

celle-là http://URL.exe  => OK

celle-ci http://URL.htm ICI  => n'apparait pas

- Faire ceci, puis cela :

- C:\Program Files\log.txt


jp@MDK:~/tmpfs ssh$
;-\

;-))
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
sed 's|<a href="\([^"]*\)">|\1|g' 
--
106485010510997108
0
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   392
 
ça laisse ttes les balises intactes :((
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Mets ton fichier sur cjoint.com.
0
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   392
 
Excusez-moi, encore une question au sujet de ceci :

Avec l'expression "<[^>]*>" on limite la portée au 1er > rencontré, d'où la nécessité de préciser le "g" (global), pour répéter l'expression autant de fois quelle sera rencontrée sur la ligne.

Est-ce que c'est possible de l'appliquer sur un grep de ce type

Expression | grep.exe -o [a-zA-Z]:\\.*\.[a-zA-Z]\{3\}


là je souhaite matcher tous les chemins de fichiers dont l'extension ne comporte que 3 caractères (pas trouvé d'autre soluce + générale, pour le cas des fichiers .html par exemple), le pb c'est justement la gourmandise de cette regexp qui va aller au bout de la ligne chercher ce .extension, et donc du coup tout foire si jamais sur la même ligne il y a

C:\chemin\fichier.exe C:\fichier.txt

càd qu'il va lister uniquement :

C:\chemin\fichier.exe C:\fichier.txt


et non pas

C:\chemin\fichier.exe
C:\fichier.txt


Comment l'arrêter à la première occurence de ce . mais continuer sur les autres motifs ? les essais que j'ai tenté avec l'expression de jipicy couplé à l'option -m 1 s'arrêtent net dès la première occurence, impossible de lire un fichier entier

Merci
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,
$ cat eZula
C:\chemin\fichier.exe C:\fichier.txt
C:\chemin\fichier.exe C:\fichier.txt

$ cat eZula |grep -Eo '[a-zA-Z]:\\.*\.[a-zA-Z][a-zA-Z][a-zA-Z]'
C:\chemin\fichier.exe C:\fichier.txt
C:\chemin\fichier.exe C:\fichier.txt
$ for i in $(cat eZula |grep -Eo '[a-zA-Z]:\\.*\.[a-zA-Z][a-zA-Z][a-zA-Z]');do echo $i;done
C:\chemin\fichier.exe
C:\fichier.txt
C:\chemin\fichier.exe
C:\fichier.txt
$ cat eZula |grep -Eo '[a-zA-Z]:\\.*\.[a-zA-Z][a-zA-Z][a-zA-Z]'|sed 's/ /\n/'
C:\chemin\fichier.exe
C:\fichier.txt
C:\chemin\fichier.exe
C:\fichier.txt
0
eZula Messages postés 3391 Date d'inscription   Statut Contributeur Dernière intervention   392
 
Merci lamij

pour windows

type fichier | grep -Eo [a-zA-Z]:\\.*\.[a-zA-Z][a-zA-Z][a-zA-Z] | sed "s/ /\n/" > z.txt & sed -i "s/$/\r/g" z.txt


obligé de remplacer ces fichues fins de ligne,

curieusement sed "s/ /\n/;s/$/\r/g" ne marche qu'à moitié dans ton expression, c'est normal ?
0