Extraire chaine dun fichie.html en Bash
manfire
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
jipicy Messages postés 40842 Date d'inscription Statut Modérateur Dernière intervention -
jipicy Messages postés 40842 Date d'inscription Statut Modérateur Dernière intervention -
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
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:
- Extraire chaine dun fichie.html en Bash
- Extraire une video youtube - Guide
- Extraire le son d'une vidéo - Guide
- Chaine tnt gratuite sur mobile - Guide
- Extraire image pdf - Guide
- Chaine radio - Télécharger - Médias et Actualité
4 réponses
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.
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.
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]$
;-))
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
Ou si tu te rappelles ta solution avec awk
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
Re,
D'autres possibilités
S'il y a un seule enregistrement dans le fichier
S'il y a un seul enregistrement mais réparti sur plusieurs ligne
S'il y a plusieurs enregistrements sur plusieurs lignes
Solution générique (à condition que les enregistrements sont entre les balises <div et </div )
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
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
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
Quelle syntaxe as-tu choisie ?
Si on s'en réfère à mon message #3, il suffit de rajouter :
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
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