Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/06/2011, à 10:07

LeXav

Extraire une chaine avec Grep...sed ...

Bonjour,

Mon historique de clients individuels est stocké dans un documents calc, mais les adresses mails ne sont pas spécifiées dans un champs particulier.Je me suis donc dit que j'allais les extraire en deux coups de cuillères à pot avec une ou deux commandes shell.
Mais je sèche.


je commence par sélectionner les lignes avec grep :

grep [a-z0-9.A-Z_-]*@[a-z]*.[a-z]* test.csv

Pas de soucis, ça me sort bien les lignes contenant une adresse mail. Mais je voudrais les extraire ces adresses... J'essaye des choses avec SED

grep [a-z0-9.A-Z_-]*@[a-z]*.[a-z]* test.csv|sed "s/[a-z0-9.A-Z_-]*@[a-z]*.[a-z]*//"

Ceci me remplace les adresses par du vide... bon pas d'interet. Mais je pensais qu'en utilisant une negation, ça m'enleverait que ce qui n'est pas une adresse mail :

grep [a-z0-9.A-Z_-]*@[a-z]*.[a-z]* test.csv|sed "s/[a-z0-9.A-Z_-]*@[a-z]*.[a-z]* !//"

Et la, ça marche pas...

Quelqu'un aurait un indice pour m'aider ?
Merci.


Geek dans la mode enfantine.
La Queue du Chat
Progression du libre dans la boite : 70%
Nombre d'users restant a convertir : 3 :-)

Hors ligne

#2 Le 04/06/2011, à 11:12

olazon

Re : Extraire une chaine avec Grep...sed ...

Bonjour,
et si  tu envois le résultat dans un fichier?

grep [a-z0-9.A-Z_-]*@[a-z]*.[a-z]* test.csv > mon_fichier.txt

...si l'utopie est une chimère comme le dit le dictionnaire,
alors nous voulons des chimères partout sur la terre...  (Les barbarins fourchus)

Hors ligne

#3 Le 04/06/2011, à 11:20

LeXav

Re : Extraire une chaine avec Grep...sed ...

olazon a écrit :

Bonjour,
et si  tu envois le résultat dans un fichier?

grep [a-z0-9.A-Z_-]*@[a-z]*.[a-z]* test.csv > mon_fichier.txt

Le grep me trie les lignes, mais pas les adresses a l’intérieur des lignes.
Dans mon document, les lignes ressemblent a quelque chose de ce goût la :

Monsieur Toto Léon , toto@gmail.com, 5 rue qui tourne 47130 Le trou
Léontine Lajoie 25 Av du virage droit 46000 Levinquipique <leontine@yahoo.fr>

Il n'y a pas de formatage, les adresses sont situées aléatoirement dans le document.


Geek dans la mode enfantine.
La Queue du Chat
Progression du libre dans la boite : 70%
Nombre d'users restant a convertir : 3 :-)

Hors ligne

#4 Le 04/06/2011, à 11:22

AnsuzPeorth

Re : Extraire une chaine avec Grep...sed ...

Bjr,
Si ton ER est correct, un truc du genre:

sed -n 's|.*\([a-z0-9.A-Z_-]*@[a-z]*.[a-z]*\).*|\1|p' test.csv

un bon tuto pour sed
http://www.commentcamarche.net/faq/suje … sed-part-i

edit: ton ER ne fonctionne pas avec les exemples que tu donnes.

Dernière modification par AnsuzPeorth (Le 04/06/2011, à 11:26)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#5 Le 04/06/2011, à 11:28

LeXav

Re : Extraire une chaine avec Grep...sed ...

AnsuzPeorth a écrit :

Bjr,
Si ton ER est correct, un truc du genre:

sed -n 's|.*\([a-z0-9.A-Z_-]*@[a-z]*.[a-z]*\).*|\1|p' test.csv

un bon tuto pour sed
http://www.commentcamarche.net/faq/suje … sed-part-i

edit: ton ER ne fonctionne pas avec les exemples que tu donnes.

Ah ! Ça progresse. Mais j'obtiens ceci :

@gmail.com
@yahoo.fr

etc etc  ..  il me manque la première partie. :s

Si je mets :

sed -n 's|.*\([a-z0-9.A-Z_-]@[a-z]*.[a-z]*\).*|\1|p' test.csv

   Sians le *

j'obtiens :   
o@yahoo.fr
e@gmail.com

etc etc ...

Dès que je rajoute le '*' avant '@' ça coupe la recherche ....

Dernière modification par LeXav (Le 04/06/2011, à 11:30)


Geek dans la mode enfantine.
La Queue du Chat
Progression du libre dans la boite : 70%
Nombre d'users restant a convertir : 3 :-)

Hors ligne

#6 Le 04/06/2011, à 11:33

AnsuzPeorth

Re : Extraire une chaine avec Grep...sed ...

Ton ER est mauvaise, il faut la revoir.
Si tu as soit un espace, soit un < avant l'adresse

sed -n 's|.*[ <]\([a-z0-9.A-Z_-]*@[a-z]*.[a-z]*\).*|\1|p'

Mais bon, l'ER peut être mieux torché je pense ...

Dernière modification par AnsuzPeorth (Le 04/06/2011, à 11:35)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#7 Le 04/06/2011, à 11:36

LeXav

Re : Extraire une chaine avec Grep...sed ...

AnsuzPeorth a écrit :

Ton ER est mauvaise, il faut la revoir.
Si tu as soit un espace, soit un < avant l'adresse

sed -n 's|.*[ <]\([a-z0-9.A-Z_-]*@[a-z]*.[a-z]*\).*|\1|p'

Mais bon, l'ER peut être mieux torché je pense ...

Bon ça marche, mais je n'ai pas compris pourquoi. 'ER', il va falloir que je buche ça smile
Merci de ton aide.


Geek dans la mode enfantine.
La Queue du Chat
Progression du libre dans la boite : 70%
Nombre d'users restant a convertir : 3 :-)

Hors ligne

#8 Le 04/06/2011, à 11:37

AnsuzPeorth

Re : Extraire une chaine avec Grep...sed ...

Ou alors avec grep; l'ER passe:

grep -o [a-z0-9.A-Z_-]*@[a-z]*.[a-z]*

Je vais peut être dire une bétise, mais avec grep c'est la complétion bash, alors qu'avec sed c'est une ER

Dernière modification par AnsuzPeorth (Le 04/06/2011, à 11:40)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 04/06/2011, à 11:53

LeXav

Re : Extraire une chaine avec Grep...sed ...

AnsuzPeorth a écrit :

Ou alors avec grep; l'ER passe:

grep -o [a-z0-9.A-Z_-]*@[a-z]*.[a-z]*

Je vais peut être dire une bétise, mais avec grep c'est la complétion bash, alors qu'avec sed c'est une ER

Cette dernière méthode marche très bien et est plus simple pour mes p'tites compétences. ;-)
Merci et bravo.


Geek dans la mode enfantine.
La Queue du Chat
Progression du libre dans la boite : 70%
Nombre d'users restant a convertir : 3 :-)

Hors ligne

#10 Le 04/06/2011, à 11:56

LeXav

Re : Extraire une chaine avec Grep...sed ...

Bizarre, je trouve pas de documentation pour l'option " -o " de grep .... ?

Dernière modification par LeXav (Le 04/06/2011, à 11:57)


Geek dans la mode enfantine.
La Queue du Chat
Progression du libre dans la boite : 70%
Nombre d'users restant a convertir : 3 :-)

Hors ligne

#11 Le 04/06/2011, à 11:58

LeXav

Re : Extraire une chaine avec Grep...sed ...

LeXav a écrit :

Bizarre, je trouve pas de documentation pour l'option " -o " de grep .... ?


J'ai rien dit.... c'est dans le man.   (#honteux #vasecacher)


Geek dans la mode enfantine.
La Queue du Chat
Progression du libre dans la boite : 70%
Nombre d'users restant a convertir : 3 :-)

Hors ligne

#12 Le 04/06/2011, à 11:58

AnsuzPeorth

Re : Extraire une chaine avec Grep...sed ...

man grep

       -o, --only-matching
              Print only the matched (non-empty) parts  of  a  matching  line,
              with each such part on a separate output line.

Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#13 Le 04/06/2011, à 12:05

Watael

Re : Extraire une chaine avec Grep...sed ...

salut

Je vais peut être dire une bétise, mais avec grep c'est la complétion bash, alors qu'avec sed c'est une ER

oui, parce que le /re/ de grep, c'est pour bash completion. LOL!


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 04/06/2011, à 12:09

AnsuzPeorth

Re : Extraire une chaine avec Grep...sed ...

Watael a écrit :

oui, parce que le /re/ de grep, c'est pour bash completion. LOL!

Je me doutais un peu, mais comme il y a l'option E ou egrep pour les ERE, je pensais bêtement que c'était bash qui s'occupé de la complétion.
Si c'est identique, pourquoi ca passe avec grep et pas avec sed, alors qu'on parle d'ER ?


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#15 Le 04/06/2011, à 12:37

Watael

Re : Extraire une chaine avec Grep...sed ...

probablement, parce que l'expression utilisée dans la commande sed est un peu plus complexe.
'.*' est un glouton.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#16 Le 04/06/2011, à 12:52

Haleth

Re : Extraire une chaine avec Grep...sed ...

Tu peux montrer une ligne complete, et la partie que tu veux extraire ? merci


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#17 Le 04/06/2011, à 13:40

AnsuzPeorth

Re : Extraire une chaine avec Grep...sed ...

Watael a écrit :

probablement, parce que l'expression utilisée dans la commande sed est un peu plus complexe.
'.*' est un glouton.

big_smile
J'ai juste ajouté ça par habitude (.*), tu peux mettre exactement la même ER, et ca ne passe pas qd même ! D'où ma déduction foireuse de complétion et ER ...

Tu peux montrer une ligne complete, et la partie que tu veux extraire ? merci

Il en donne plus haut, faut tout lire wink


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#18 Le 04/06/2011, à 20:48

LeXav

Re : Extraire une chaine avec Grep...sed ...

Watael a écrit :

probablement, parce que l'expression utilisée dans la commande sed est un peu plus complexe.
'.*' est un glouton.

Est un glouton ? Mais encore ? :-)


Geek dans la mode enfantine.
La Queue du Chat
Progression du libre dans la boite : 70%
Nombre d'users restant a convertir : 3 :-)

Hors ligne

#19 Le 04/06/2011, à 21:15

Watael

Re : Extraire une chaine avec Grep...sed ...

regarde

info sed

et fais une recherche sur greedy


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 04/06/2011, à 21:58

aduxas

Re : Extraire une chaine avec Grep...sed ...

Il y a des adresses email avec des _ et des chiffres dans le domaine!

sed 's/.*\(\<[-_[:alnum:]]\+@[[:alnum:]_]\+\.[[:alpha:]]\+\).*/\1/' mon_fichier

J'explique:
Disons qu'un mot, c'est au moins un caractère alphanumérique, tiret ou underscore, et une extension une suite de lettres.  Je considère une adresse la forme mot@mot.extension.
Je remplace truc-adresse-truc par adresse.  J'ai donc mis adresse entre des délimiteurs \( et \) et j'y fais référence avec \1.  Il faut mettre le tiret au début sinon sed pense qu'il sert à définir une série comme a-z.

Dernière modification par aduxas (Le 04/06/2011, à 22:04)

Hors ligne

#21 Le 04/06/2011, à 23:40

aduxas

Re : Extraire une chaine avec Grep...sed ...

Si jamais le fichier contient des lignes sans adresse email, on peut les virer avant:

sed '/@/!d;s/.*\(\<[-_[:alnum:]]\+@[[:alnum:]_]\+\.[[:alpha:]]\+\).*/\1/' mon_fichier

Comme tout le monde semble parti, encore ceci:  il faut commencer l'expression de l'adresse email avec un délimiteur de début de mot \< sinon la chaîne générale .* avale tout jusqu'au dernier caractère avant l'arobase; le multiplicateur \+ en effet se contente d'un seul caractère.

Hors ligne

#22 Le 04/06/2011, à 23:54

Hizoka

Re : Extraire une chaine avec Grep...sed ...

peux tu donner plus de 2 ex stp ?

qu'on voit un peu les differents cas possibles.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#23 Le 05/06/2011, à 00:00

Hizoka

Re : Extraire une chaine avec Grep...sed ...

avec du full bash tongue

test="Monsieur Toto Léon , toto@gmail.com, 5 rue qui tourne 47130 Le trou
Léontine Lajoie 25 Av du virage droit 46000 Levinquipique <leontine@yahoo.fr>
Madame Titine Léon - titine@gmail.com- 5 rue qui tourne 47130 Le trou
Léontimlkmlkne Lajoie 25 Av du virage droit 46000 kjhkjh <hgfhfg@yahoo.fr>"

while read ligne
do
 tableau=(${ligne})
 for i in ${tableau[@]}; do [[ "$i" =~ @ ]] && echo "$i"; done
done <<< "$test"

=> toto@gmail.com,
=> <leontine@yahoo.fr>
=> <letitine@gmail.com-
=> <hgfhfg@yahoo.fr>

apres il faut voir pour traiter les adresses, genre virer les -,>,;>.... de fin de ligne et debut...


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#24 Le 05/06/2011, à 01:48

aduxas

Re : Extraire une chaine avec Grep...sed ...

Hizoka a écrit :

apres il faut voir pour traiter les adresses, genre virer les -,>,;>.... de fin de ligne et debut...

Ah.  Aussi en full bash? tongue

Dernière modification par aduxas (Le 05/06/2011, à 01:51)

Hors ligne

#25 Le 05/06/2011, à 05:18

Hizoka

Re : Extraire une chaine avec Grep...sed ...

ba ouais...

i="<hgfhfg@yahoo.fr>"
i=${i/#[><-+,]}
i=${i/%[><-+,]}
=> hgfhfg@yahoo.fr

par exemple...

Dernière modification par Hizoka (Le 05/06/2011, à 05:21)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne