Sed et substitutions balises html
Résolu/Fermé
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
-
2 nov. 2008 à 15:32
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 - 22 févr. 2009 à 21:56
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 - 22 févr. 2009 à 21:56
A voir également:
- Sed html
- Editeur html - Télécharger - HTML
- Html download - Télécharger - HTML
- Sed supprimer ligne - Astuces et Solutions
- Br html ✓ - Forum Webmastering
- &Nbsp html ✓ - Forum Webmastering
19 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
2 nov. 2008 à 15:43
2 nov. 2008 à 15:43
Salut,
sed 's|<[^>]*>||g';-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
2 nov. 2008 à 15:58
2 nov. 2008 à 15:58
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.
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.
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
392
4 nov. 2008 à 08:50
4 nov. 2008 à 08:50
Salut,
merci, mais ça ne marche pas : caractère 27: commande `s' inachevée, même avec deux | + combinaison
il n'y a plus les retours lignes et surtout plus aucune URL alors que j'arrive à en récupérer au moins une
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
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
392
2 nov. 2008 à 15:48
2 nov. 2008 à 15:48
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
2 nov. 2008 à 16:09
2 nov. 2008 à 16:09
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é
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é
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
392
2 nov. 2008 à 16:18
2 nov. 2008 à 16:18
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 :)
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
392
4 nov. 2008 à 08:11
4 nov. 2008 à 08:11
Pardon, je reviens un instant vers vous car un pb se pose. Je souhaiterais que sed épargne tous les liens de type
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 :
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)
<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)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
4 nov. 2008 à 08:40
4 nov. 2008 à 08:40
Salut,
essaie d'abord
essaie d'abord
sed 's|<a *href=\("[^"]"\)>/\1|g'et ensuite
sed 's|<[^>]*>||g'P.S. Je n'ai pas testé
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
4 nov. 2008 à 08:54
4 nov. 2008 à 08:54
Oups, j'ai oublié que le séparateur est |
au lieu de
sed 's|<a *href=\("[^"]"\)>/\1|g' mettre
au lieu de
sed 's|<a *href=\("[^"]"\)>/\1|g' mettre
sed 's|<a *href=\("[^"]"\)>|\1|g'
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
4 nov. 2008 à 08:56
4 nov. 2008 à 08:56
Salut,
Essaye ça :
Essaye ça :
sed 's|<br />|\n|g;s|\(<a href=\"\)\([^"]*\)\([^>]>\)|\2 |g;s|<[^>]*>||g' fichier.html
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
4 nov. 2008 à 08:57
4 nov. 2008 à 08:57
Salut,
Pourquoi tu fais autant des captures?!
Pourquoi tu fais autant des captures?!
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
4 nov. 2008 à 09:20
4 nov. 2008 à 09:20
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 <.*> ;-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 nov. 2008 à 09:24
4 nov. 2008 à 09:24
Ben, pas toute à fait vu que tu n'utilises que la deuxième références arrière \2
D'où ma question.
D'où ma question.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
4 nov. 2008 à 09:32
4 nov. 2008 à 09:32
Oups t'as raison, avec une ça suffit ;-((
Merchi ;-))
Merchi ;-))
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
392
4 nov. 2008 à 08:57
4 nov. 2008 à 08:57
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... :)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
4 nov. 2008 à 08:58
4 nov. 2008 à 08:58
Mince, j'ai oubilé le quantificateur
Mon expression cherchais seulemetn un caractère
Teste la ligne de jipicy.
Au moins il a la possibilité de tester ;-))
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 ;-))
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
392
4 nov. 2008 à 09:02
4 nov. 2008 à 09:02
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
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
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
4 nov. 2008 à 09:11
4 nov. 2008 à 09:11
On peut avoir un exemplaire du fichier html s'il te plait ? (au cas ou en MP si problème de droits ou autre...)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
4 nov. 2008 à 10:57
4 nov. 2008 à 10:57
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$;-\
;-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
4 nov. 2008 à 09:06
4 nov. 2008 à 09:06
sed 's|<a href="\([^"]*\)">|\1|g'--
106485010510997108
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
392
4 nov. 2008 à 09:10
4 nov. 2008 à 09:10
ça laisse ttes les balises intactes :((
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
4 nov. 2008 à 09:16
4 nov. 2008 à 09:16
Mets ton fichier sur cjoint.com.
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
392
22 févr. 2009 à 21:17
22 févr. 2009 à 21:17
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
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 :
et non pas
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
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
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
22 févr. 2009 à 21:37
22 févr. 2009 à 21:37
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
eZula
Messages postés
3392
Date d'inscription
samedi 26 avril 2008
Statut
Contributeur
Dernière intervention
8 mai 2021
392
22 févr. 2009 à 21:56
22 févr. 2009 à 21:56
Merci lamij
pour windows
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 ?
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 ?