Sziasztok!
Bizonyos okokból saját autoresponse scriptet írok, de belefutottam egy olyan problémába, hogy a ^From: után több sor van, és csak a végén van az email cím.
Valami ilyesmi:
From: blablablablablablablabla
blabla blablabla blabla
bla blablabla blabla kacsacsőr akarki@barhol.hu kacsacsőr
Hogy lehetne ezt értelmesen kiszedni a sorok közül?
Köszönöm!
ui: persze, ha van Reply-To, akkor azt keresem.
- 4240 megtekintés
Hozzászólások
Biztosan van erre valami kész program, de ha grep
-pel kellene, inkább sed
-del próbálkoznék.
$ cat email
From: blablablablablablablabla
blabla blablabla blabla
bla blablabla blabla >
akarki@barhol.hu
>
Esetén:
$ sed -n "/From:/,/@/ s,^\([^ ]*@[^ ]*\),\1,p" email
akarki@barhol.hu
Már ha azt feltételezem, hogy az email-címet keresed.
A kód közel nem tökéletes, de egy kiindulásnak jó lehet.
- A hozzászóláshoz be kell jelentkezni
Ez tetszik, a példán működik is, de éles emaileken nem, valószínűleg a speciális karakterek miatt. Jól gondolom?
- A hozzászóláshoz be kell jelentkezni
Egyrészt "A kód közel nem tökéletes, de egy kiindulásnak jó lehet.", másrészt konkrét példa kellene, amin nem működik (az érzékeny adatok esetleg átírva).
- A hozzászóláshoz be kell jelentkezni
uzsolt sed-es megoldása jobb, takarékosabb az awk-ásnál, mert nem szűri át az összes adatot.
1.
/^From:/
2.
az email part-okat
\S+
-ként keresni sztem nem jó.
inkább
[a-z0-9_.-]+
.
igaz, ha tényleg minden valid email címet ki akarunk szedni, ahhoz elég bonyolult és hosszú regexpek vannak. nekem ilyen szintű kereséshez elég szok lenni a fenti minta.
3.
nem kell start anchor-olni, ill. lehetne ha minden másra is ráillesztenél hogy a replace részben majdan csak az első group-ra cserélje ki az egész sort, de az első példából hiányzik a két
.*
, így ott marad az előtte/utána lévő rész is.
s,.*\?\([a-z0-9_.-]\+@[a-z0-9_.-]\+\).*,\1, p
mondjuk ez a példa se jó, mert pl. nálam a sed sehogy se akar ungreedy lenni.
~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack
- A hozzászóláshoz be kell jelentkezni
Mint írtam: "A kód közel nem tökéletes, de egy kiindulásnak jó lehet." :)
- A hozzászóláshoz be kell jelentkezni
megértettem, ki is indultam belőle :)
~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack
- A hozzászóláshoz be kell jelentkezni
Ezt ráeresztettem az alábbi mailre:
From: =?utf-8?Q?Piac_=C3=A9s_Profit_Konferenciak=C3=B6zpont?= "noreply@piac-profit.com"
Message-ID: "6d701a59177669b97f01645b130c3848@wg.piacesprofit.hu"
A kacsacsőröket idézőjellel helyettesítettem. Ezt köpte ki:
y@piac-profit.com
8@wg.piacesprofit.hu
Egyébként nagyon köszönöm a segítséget természetesen :)
- A hozzászóláshoz be kell jelentkezni
Reszeltem egy ilyet, ez majdnem jó, egy helyen hasalt el, ha nem volt kacsacsőr az email cím előtt és után:
sed -n -e '/^From:/,$p' mail|grep "[nyitó-kacsacsőr].*\@.*[záró-kacsacsőr]"|cut -d "nyitó-kacsacsőr" -f2|cut -d "záró-kacsacsőr" -f1|head -1
- A hozzászóláshoz be kell jelentkezni
$ words=$(sed -n "/From:/,/@/ p" mail.txt | sed "s/[<>]/ /g")
$ for i in $words; do echo $i | grep @ ; done
________________________________________
https://sites.google.com/site/eutlantis/
- A hozzászóláshoz be kell jelentkezni
aha ez azért van, mert a sed mohó (greedy) és az első .*-gal megeszi az email localpart-ját.
nekem nem sikerült lebeszélni a mohóságról.
lehetne szóköz-idézőjel-kisebbmint jelhez kötni az email cím elejét:
s,.*[ ""<]\([a-z0-9_.-]\+@[a-z0-9_.-]\+\).*,\1, p
~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack
- A hozzászóláshoz be kell jelentkezni
nekem nem sikerült lebeszélni a mohóságról.
Ezért akartam úgy kerestetni, hogy "egy kukac karakter előtti összes nem szóköz karakter". Nyilván a továbbfejlesztés egy olyasmi lehetne, hogy "egy kukac karakter előtti összes nem szóköz, idézőjel, dollárjel, stb.". Ekkor szerintem jól kellene, hogy működjön, és a "mohósága" is meg lenne oldva.
- A hozzászóláshoz be kell jelentkezni
az Email formátum soralapú ugyan de a "rekordok" törhetőek CRLF-fel (folded header line).
javaslok valami magasabb szintű framework-öt, pl. http://search.cpan.org/~rjbs/Email-Simple-2.210/lib/Email/Simple/Header… , http://search.cpan.org/~rjbs/Email-MIME-1.937/lib/Email/MIME.pm
vagy ha nem akarsz ennyire pontos lenni, ezzel visszahajtogathatod a széttört headereket:
awk '{if(/^\r?$/){exit} if(/^\S/){print""} printf"%s",$0}END{print""}'
~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack
- A hozzászóláshoz be kell jelentkezni
"grep-pelés"
omg!
t
- A hozzászóláshoz be kell jelentkezni
Megfogtad a lényeget, Tibusz.
- A hozzászóláshoz be kell jelentkezni