Extraire plusieurs chaines de caractères

Résolu
maya79 -  
 maya79 -
Bonjour,

Par un shell Unix, j'essaie d'extraire depuis un fichier ou une variable toutes les adresses mails présentes :
ex :
To: "Support, De test" <[email protected]>, [email protected]
CC: "Berthier, Marcel" <[email protected]>,
"Barbotin, Paulo"
<[email protected]>,
"Le Bec, De lievre" <[email protected]>,
"Bellenger, Lucette" <[email protected]>

Résultat attendu : [email protected] [email protected] [email protected] [email protected] [email protected] [email protected]

J'ai essayé par un sed pour me débarrasser des chaines de caractères délimités par un espace mais qui ne contient pas le caractère "@", en vain.

J'accepte toute proposition

Merci d'avance
Configuration: Windows XP Internet Explorer 6.0
A voir également:

5 réponses

mamiemando Messages postés 33901 Date d'inscription   Statut Modérateur Dernière intervention   7 916
 
Je ferais un grep (en passant l'expression permettant de rattraper une adresse mail) cut sur le séparateur < (prendre le champ 2) et un cut sur le séparateur > (prendre le champ 1. Dans l'idée ça ressemble à ça (sur la même ligne) :

grep "[a-zA-Z0-9.\-]*@[a-zA-Z0-9.\-]*" /le/chemin/vers/le/fichier.txt | cut -d'<' -f2 | cut -d'>' -f1


(à tester)

Bonne chance
0
maya79
 
Merci mamiemando,

Effectivement ca marche en grande partie mais je ne récupère qu'une adresse mail par ligne. Dans mon exemple, on perd l'adresse [email protected].

D'où l'idée de faire un découpage sur le caractère espace mais je sèche toujours.
0
lami20j
 
Salut,

lami20j@debian:~$ cat mail.txt
To: "Support, De test" <[email protected]>, [email protected]
CC: "Berthier, Marcel" <[email protected]>,
"Barbotin, Paulo"
<[email protected]>,
"Le Bec, De lievre" <[email protected]>,
"Bellenger, Lucette" <[email protected]>
lami20j@debian:~$ grep "[a-zA-Z0-9.\-]*@[a-zA-Z0-9.\-]*" mail.txt | cut -d'<' -f2 | cut -d'>' -f1
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
lami20j@debian:~$
lami20j@debian:~$
lami20j@debian:~$
lami20j@debian:~$
lami20j@debian:~$ grep -o "[a-zA-Z0-9.\-]*@[a-zA-Z0-9.\-]*" mail.txt
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
0
maya79
 
bonjour et merci également.

Néanmoins grep ne reconnait pas l'option -o, qu'est-elle sensée faire ?
0
mamiemando Messages postés 33901 Date d'inscription   Statut Modérateur Dernière intervention   7 916
 
Apparemment ça marche pas si mal :-) De toute façon d'un point de vue expression régulière, ce que j'ai mis est sensé rattraper [email protected] aussi. L'expression régulière que j'ai écrite signifie "une suite de 0 à n caractères parmi a...z A...Z 0...9 . et -, une @, et à nouveau une suite de 0 à n caractères parmi a...z A...Z 0...9 . et -.

Tu es sûr que l'adresse mail que tu ne récupères pas respecte bien cette expression régulière ?

Bonne chance
0
lami20j
 
Salut,

ce que j'ai mis est sensé rattraper [email protected] aussi.

Oui, et ça le fait ;-)
C'est le cut qui perd en chemin [email protected] puisque cette adresse n'est pas entouré par des chevrons < et >

~$ cat mail.txt
To: "Support, De test" <[email protected]>, [email protected]
CC: "Berthier, Marcel" <[email protected]>,
"Barbotin, Paulo"
<[email protected]>,
"Le Bec, De lievre" <[email protected]>,
"Bellenger, Lucette" <[email protected]>


1er cut

~$ cat mail.txt|grep "[a-zA-Z0-9.\-]*@[a-zA-Z0-9.\-]*" |cut -d'<' -f2
[email protected]>, [email protected]
[email protected]>,
[email protected]>,
[email protected]>,
[email protected]>

2ème cut

~$ cat mail.txt|grep "[a-zA-Z0-9.\-]*@[a-zA-Z0-9.\-]*" |cut -d'<' -f2|  cut -d'>' -f1
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18808 Date d'inscription   Statut Contributeur Dernière intervention   5 652
 
hello
$ cat a3
To: "Support, De test" <[email protected]>, [email protected]
CC: "Berthier, Marcel" <[email protected]>,
"Barbotin, Paulo"
<[email protected]>,
"Le Bec, De lievre" <[email protected]>,
"Bellenger, Lucette" <[email protected]> 
$ 
$ perl -wne'while(/[\w\.\-]+@[\w\.\-]+\w+/g){print "$&\n"}' a3
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
$ 
0
maya79
 
Bonjour et grand merci,

cette solution via Perl marche du tonnerre.
Je ne connais pas du tout Perl, dommage mais au moins ça fonctionne.

Merci
0