Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

sed, regexp, quantificateurs

3 réponses
Avatar
gvdmoort
Bonjour =E0 tous,

Je voudrais me servir de sed pour extraire des cha=EEnes de caract=E8res
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=3D'ab'><i>machin</i></td><td id=3D'cd'><i>truc</i></td></tr>

Je voudrais par exemple extraire le contenu de la premi=E8re cellule.

Je fais des essais sur une simple cha=EEne avant d'attaquer le fichier:

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

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

=C9videmment, je voudrais obtenir <i>machin</i>. La pr=E9sence de balises
<> dans les cellules m'emp=EAche d'utiliser [^>]*</td> pour d=E9finir le
contenu d'une seule cellule.

Je lis qu'on peut rendre lequantificateur + "paresseux" en ajoutant ?,
de mani=E8re =E0 ce qu'il s'arr=EAte apr=E8s la premi=E8re occurrence. Mais

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

renvoit toute la cha=EEne :(
<tr><td id=3D'ab'><i>machin</i></td><td id=3D'cd'><i>truc</i></td></tr>

et d'ailleurs l'usage d'un + sans ajouter ? m'est d=E9j=E0
incompr=E9hensible:

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

Pourquoi est-ce que cette expression ne fonctinne plus ?

Merci pour tout =E9claircissement.

G.

3 réponses

Avatar
Jogo
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 -
Avatar
Marc Boyer
Le 06-09-2009, gvdmoort a écrit :
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'><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.



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
Avatar
Cyrille Lefevre
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'><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 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|</?tr>||g;s| id='..'||g;s|</td><td>|;|g;s|</?td>||g"
<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.