sed, regexp, quantificateurs

Le
gvdmoort
Bonjour à tous,

Je voudrais me servir de sed pour extraire des chaînes de caractères
d'un vaste tableau en html, et je ne m'en sors pas avec les
quantificateurs.

En simplifiant, un fichier html contient tout un tableau en une seule
ligne. Dans cette ligne, on a donc une succesion de

<tr><td id='ab'><i>machin</i></td><td id='cd'><i>truc</i></td></tr>

Je voudrais par exemple extraire le contenu de la première cellule.

Je fais des essais sur une simple chaîne avant d'attaquer le fichier:

gv@fantasio:~$ echo "<tr><td id='ab'><i>machin</i></td><td
id='cd'><i>truc</i></td></tr>" | sed "s,.*<td id='ab'>(.*)</td>.*,
1,g"

<i>machin</i></td><td id='cd'><i>truc</i>

Évidemment, je voudrais obtenir <i>machin</i>. La présence de balises
<> dans les cellules m'empêche d'utiliser [^>]*</td> pour définir le
contenu d'une seule cellule.

Je lis qu'on peut rendre lequantificateur + "paresseux" en ajoutant ?,
de manière à ce qu'il s'arrête après la première occurrence. Mais

gv@fantasio:~$ echo "<tr><td id='ab'><i>machin</i></td><td
id='cd'><i>truc</i></td></tr>" | sed "s,.*<td id='ab'>(.+?)</td>.*,
1,g"

renvoit toute la chaîne :(
<tr><td id='ab'><i>machin</i></td><td id='cd'><i>truc</i></td></tr>

et d'ailleurs l'usage d'un + sans ajouter ? m'est déjà
incompréhensible:

gv@fantasio:~$ echo "<tr><td id='ab'><i>machin</i></td><td
id='cd'><i>truc</i></td></tr>" | sed "s,.*<td id='ab'>(.+)</td>.*,
1,g"
<tr><td id='ab'><i>machin</i></td><td id='cd'><i>truc</i></td></tr>

Pourquoi est-ce que cette expression ne fonctinne plus ?

Merci pour tout éclaircissement.

G.
Questions / Réponses high-tech
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
Jogo
Le #20081591
Bonjour,

Si vous utilisez GNU sed, l'option --regexp-extended vous permettra
d'utiliser toutes les possibilités des "expressions régulières
étendues", comme les quantificateurs feignants. Sinon vous n'avez le
droit qu'au BRE, où notamment les quantificateurs doivent être échappés.

Mais de toutes manières l'HTML est trop complexe pour être attaqué à
coup d'expressions régulières. Il vaut mieux utiliser des programmes ou
des bibliothéques spécialisées.

--
La passion est ordinairement scellée, on le sait, par la déclaration
à l'autre : "Tu me manques". "Quoi me manque quand l'Autre me manque ?"
- Freud -
Marc Boyer
Le #20087051
Le 06-09-2009, gvdmoort
Bonjour à tous,

Je voudrais me servir de sed pour extraire des chaînes de caractères
d'un vaste tableau en html, et je ne m'en sors pas avec les
quantificateurs.

En simplifiant, un fichier html contient tout un tableau en une seule
ligne. Dans cette ligne, on a donc une succesion de

<tr><td id='ab'><i>machin</i></td><td id='cd'><i>truc</i></td></tr>

Je voudrais par exemple extraire le contenu de la première cellule.

Je fais des essais sur une simple chaîne avant d'attaquer le fichier:

:~$ echo "<tr><td id='ab'><i>machin</i></td><td
id='cd'> 1,g"

<i>machin</i></td><td id='cd'><i>truc</i>

Évidemment, je voudrais obtenir <i>machin</i>. La présence de balises
<> dans les cellules m'empêche d'utiliser [^>]*</td> pour définir le
contenu d'une seule cellule.



Tu peux toujours essayer de faire ça avec deux sed en séquence,
le premier étant celui que tu as fait, le second coupant ce
qui sort en trop.
Après, comme l'a dit un autre contributeur, sed n'est pas
forcément le meilleur outil pour extraire des infos du html.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Cyrille Lefevre
Le #20099391
gvdmoort a écrit :
Bonjour à tous,

Je voudrais me servir de sed pour extraire des chaînes de caractère s
d'un vaste tableau en html, et je ne m'en sors pas avec les
quantificateurs.

En simplifiant, un fichier html contient tout un tableau en une seule
ligne. Dans cette ligne, on a donc une succesion de

<tr><td id='ab'><i>machin</i></td><td id='cd'><i>truc</i></td></tr >

Je voudrais par exemple extraire le contenu de la première cellule.

Je fais des essais sur une simple chaîne avant d'attaquer le fichier:

:~$ echo "<tr><td id='ab'><i>machin</i></td><td
id='cd'> 1,g"

<i>machin</i></td><td id='cd'><i>truc</i>

Évidemment, je voudrais obtenir <i>machin</i>. La présence de balis es
<> dans les cellules m'empêche d'utiliser [^>]*</td> pour définir l e
contenu d'une seule cellule.



Bonjour,

travail par exclusion, tu supprime ce qui te gêne et tu traite ce qu'il
reste :

echo "<tr><td id='ab'><i>machin</i></td><td id='cd'><i>truc</i></td>< /tr>" |
sed -re "s| <i>machin</i>;<i>truc</i>

les valeurs qui s'intéressent sont séparés par des ;, si tu ne veux pas
les <i>, ajout un ;s|</?i>||g à la fin de l'expression ci-dessus.

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Publicité
Poster une réponse
Anonyme