Több sorból grep-pelés

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.

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.

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

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 :)

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

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.

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