Extraire chaine dun fichie.html en Bash

Fermé
manfire Messages postés 4 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 13 mai 2010 - 28 janv. 2010 à 02:07
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 31 janv. 2010 à 14:55
Bonjour,



Je viens de demander votre aide, car je ne suis compétant bash.

Extraire une sous-chaine d'un fichie.html
voici l'exemple:
<div class="infosPermanentes"><p class="Idclient">284936</p><h2 class="nomclient">La Croix </h2><address class="adresseClient">20 rue Georges Bouttie - 72000 Le Mans </address><h3 class="activiteclient">Activités : triperie </h3></div>

j'aimerai un script qui fait l'extraction des information comme suis:


284936;La Croix;20 rue Georges Bouttie; 72000;Le Mans;triperie


Merci
A voir également:

4 réponses

jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
28 janv. 2010 à 04:47
Bonjour,
En gros, il te faudra utiliser les expressions régulière en ajoutant ; avant ou après <...> et en excluant les morceaux de chaine "<.*>"

Cela dit, comme on ne sait pas dans quel cadre cette demande est faite, je précise que nous aimons aider les étudiants à trouver des solutions à leur problème eux-même, quitte à les aiguiller un peu en les mettant sur la voix.

Montre nous déjà ce que tu as fait et nous t'aiderons.

A plus.
0
manfire Messages postés 4 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 13 mai 2010 1
30 janv. 2010 à 00:18
Bonsoir,


j ai utilisé la commande sed et voilà tous ce que j ai aboutis à écrire:

sed 's/.*Idclient">\([^<]*\).*nomclient">\([^<]*\) .*adresseClient">\([^<]*\) .*activiteclient">Activités : \([^<]*\).*/\1;\2;\3;\4/; s/ - /;/; s/ /;/g; s/ ;/;/g' testin > testout


le résultat:

<div class="infosPermanentes"><p class="Idclient">284936</p><h2 class="nomclient">La Croix </h2>
<address class="adresseClient">20 rue Georges Bouttie;72000;Le Mans;</address>
<h3 class="activiteclient">Activités : triperie </h3></div>

la question se pose comment je peux éliminer les balises HTML?



Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
30 janv. 2010 à 08:39
Salut,

[tmpfs]$ cat plop
<div class="infosPermanentes"><p class="Idclient">284936</p><h2 class="nomclient">La Croix </h2><address class="adresseClient">20 rue Georges Bouttie - 72000 Le Mans </address><h3 class="activiteclient">Activités : triperie </h3></div>

SOLUTION 1 :

[tmpfs]$ grep -o ">[^<]*<" plop | sed '/^></d;s/>\|<//g;s/.*: //'| sed '/^$/d'|sed ':z;N;$!bz;s/\n/;/g;s/ - /;/;s/;[[:digit:]]\{5\}/&;/'
284936;La Croix ;20 rue Georges Bouttie;72000; Le Mans ;triperie


SOLUTION 2 :

[tmpfs]$ w3m -dump -T text/html plop|sed '/^$/d' |sed 's/.*: //'|sed ':z;N;$!bz;s/\n/;/g;s/ - /;/;s/;[[:digit:]]\{5\}/&;/'
284936;La Croix;20 rue Georges Bouttie;72000; Le Mans;triperie

[tmpfs]$

;-))
0
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 569
30 janv. 2010 à 08:56
Salut,

Je me trompe où tout est sur une seule ligne?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
30 janv. 2010 à 10:01
Salut,

Ben je fais avec ce que j'ai ;-\
0
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 569 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
30 janv. 2010 à 10:05
Re,

;-)
J'espère qu'on ne verras pas le message "En fait je me suis mal exprimé. Mon fichier contient ..... et ça ne marche pas la commande" ;-(
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
30 janv. 2010 à 10:11
Ben à coup sûr qu'on va y avoir droit ;-((

Il n'aura qu'à adapter, il a assez d'exemples fournis pour s'en sortir ;-))

PS. T'as déjà entendu parler de "s2p" (sed-to-Perl translator) ou "a2p" (Traduteur de commande Awk à Perl) ? J'ai trouvé ça en regardant le man page de Perl ;-\
0
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 569 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
30 janv. 2010 à 10:37
Re,

Oui, j'ai déjà testé a2p mais le code est très bavard et je n'ai pas aimé, avec ma paresse tu comprends ;-)

En fait il y la possibilité de le faire directement en ligne de commande en utilisant le tableau spécial @F a l'instar de la commande awk

En fait perl avec l'option -a fait un split de la ligne selon le /motif/ donné par -F dans @F
Ce qui fait que une commande awk peut être facilement traduite en perl directement ;-) il faut juste tenir compte des variables avec sigil et que les champs sont dans un tableau.
Un exemple
:~$ awk -F":" '/lami/ {print "Home:" $6 " Shell: " $7}' </etc/passwd
Home:/home/lami20j Shell: /bin/bash
Home:/home/lamitest Shell: /bin/bash
Home:/home/lamirssh Shell: /usr/bin/rssh
:~$ perl -aF -ne 'print "Home: $F[5] Shell: $F[6]" if /lami/' </etc/passwd
Home: /home/lami20j Shell: /bin/bash
Home: /home/lamitest Shell: /bin/bash
Home: /home/lamirssh Shell: /usr/bin/rssh


Ou si tu te rappelles ta solution avec awk

~$ df -h | awk '{NR != 1; SUM+=$5} END {print SUM}'
167
~$ df -h | perl -aF"/\s+/" -ne '$SUM+=$F[4];END{print "$SUM\n"}'
167

0
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 569
30 janv. 2010 à 10:02
Re,

D'autres possibilités

S'il y a un seule enregistrement dans le fichier
$ cat plop1
<div class="infosPermanentes"><p class="Idclient">284936</p><h2 class="nomclient">La Croix </h2><address class="adresseClient">20 rue Georges Bouttie - 72000 Le Mans </address><h3 class="activiteclient">Activités : triperie </h3></div>
$ sed 's/<[^>]*>/;/g;s/ *;; */;/g;s/^;//;s/;$//;s/ *- \([0-9]\{5\}\) /;\1;/;s/;[^;]*: /;/' plop1
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie


S'il y a un seul enregistrement mais réparti sur plusieurs ligne
$ cat plop2
<div class="infosPermanentes">
<p class="Idclient">284936</p>
<h2 class="nomclient">La Croix </h2>
<address class="adresseClient">20 rue Georges Bouttie - 72000 Le Mans </address>
<h3 class="activiteclient">Activités : triperie </h3>
</div>
$ sed ':z;N;$!bz;s/\n//g;s/<[^>]*>/;/g;s/ *;; */;/g;s/^;//;s/;$//;s/ *- \([0-9]\{5\}\) /;\1;/;s/;[^;]*: /;/' plop2
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie

S'il y a plusieurs enregistrements sur plusieurs lignes
$ cat plop3
<div class="infosPermanentes">
<p class="Idclient">284936</p>
<h2 class="nomclient">La Croix </h2>
<address class="adresseClient">20 rue Georges Bouttie - 72000 Le Mans </address>
<h3 class="activiteclient">Activités : triperie </h3>
</div>

<div class="infosPermanentes">
<p class="Idclient">284936</p>
<h2 class="nomclient">La Croix </h2>
<address class="adresseClient">20 rue Georges Bouttie - 72000 Le Mans </address>
<h3 class="activiteclient">Activités : triperie </h3>
</div>
<div class="infosPermanentes">
<p class="Idclient">284936</p>
<h2 class="nomclient">La Croix </h2>
<address class="adresseClient">20 rue Georges Bouttie - 72000 Le Mans </address>
<h3 class="activiteclient">Activités : triperie </h3>
</div>
$ sed ':z;N;/<\/div/! bz;s/\n//g;s/<[^>]*>/;/g;s/ *;; */;/g;s/^;//;s/;$//;s/ *- \([0-9]\{5\}\) /;\1;/;s/;[^;]*: /;/' plop3
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie


Solution générique (à condition que les enregistrements sont entre les balises <div et </div )
$ sed ':z;N;/<\/div/! bz;s/\n//g' plop1 |sed 's/<[^>]*>/;/g;s/ *;; */;/g;s/^;//;s/;$//;s/ *- \([0-9]\{5\}\) /;\1;/;s/;[^;]*: /;/' 
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie

$ sed ':z;N;/<\/div/! bz;s/\n//g' plop2 |sed 's/<[^>]*>/;/g;s/ *;; */;/g;s/^;//;s/;$//;s/ *- \([0-9]\{5\}\) /;\1;/;s/;[^;]*: /;/' 
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie

$ sed ':z;N;/<\/div/! bz;s/\n//g' plop3 |sed 's/<[^>]*>/;/g;s/ *;; */;/g;s/^;//;s/;$//;s/ *- \([0-9]\{5\}\) /;\1;/;s/;[^;]*: /;/' 
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie
284936;La Croix;20 rue Georges Bouttie;72000;Le Mans;triperie




0
manfire Messages postés 4 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 13 mai 2010 1
31 janv. 2010 à 14:38
Bonjour,


Merci beaucoup pour vos aides, je voulait juste savoir dans le cas ou je veux spécifié de collecter d'un html seulement que les informations que je l'ai besoins par exemple on prend ce cas:

<div class="infosPermanentes"><p class="Idclient">284936</p><h2 class="nomclient">La Croix </h2><address class="adresseClient">20 rue Georges Bouttie - 72000 Le Mans </address><h3

la résultat:

La Croix;20 rue Georges Bouttie;72000;Le Mans


crd
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
31 janv. 2010 à 14:55
Quelle syntaxe as-tu choisie ?

Si on s'en réfère à mon message #3, il suffit de rajouter :

SOLUTION 1 :

[tmpfs]$ grep -o ">[^<]*<" plop | sed '/^></d;s/>\|<//g;s/.*: //'| sed '/^$\|^[[:digit:]]*$/d'|sed ':z;N;$!bz;s/\n/;/g;s/ - /;/;s/;[[:digit:]]\{5\}/&;/'
La Croix ;20 rue Georges Bouttie;72000; Le Mans ;triperie


SOLUTION 2 :

[tmpfs]$ w3m -dump -T text/html plop|sed '/^$\|^[[:digit:]]*$/d' |sed 's/.*: //'|sed ':z;N;$!bz;s/\n/;/g;s/ - /;/;s/;[[:digit:]]\{5\}/&;/'
La Croix;20 rue Georges Bouttie;72000; Le Mans;triperie
0