awk + ​​如何在字符之间捕获电子邮件地址

yae*_*ael 3 sed awk perl text-processing

我在<>字符之间有很长的电子邮件列表:

smeimebv2t <jdyefc@nsuwtcvc>; jdedyvt <ejd2ydt2@dv2dg2vgv>; didi2jd2m     <i2dmi32@hd2vdg >; 3idm23i2m <2udhu2@cdrrc>
.
.
.
Run Code Online (Sandbox Code Playgroud)

我如何使用 awk 或 perl one liner 来仅捕获< >.

例子:

more results.out

jdyefc@nsuwtcvc
ejd2ydt2@dv2dg2vgv
i2dmi32@hd2vdg
2udhu2@cdrrc
Run Code Online (Sandbox Code Playgroud)

ter*_*don 10

我能想到的最简单的方法是使用 GNU grep

$ grep -Po '<\K[^>]+(?=>)' file 
jdyefc@nsuwtcvc
ejd2ydt2@dv2dg2vgv
i2dmi32@hd2vdg 
2udhu2@cdrrc
Run Code Online (Sandbox Code Playgroud)

-o意思是“仅打印线的匹配区域”和-P激活Perl兼容的正则表达式。这些让我们使用\K这意味着“不要将到目前为止匹配的任何内容视为匹配的一部分”和积极的前瞻。因此,正则表达式将匹配 an <,然后是任何一段非>字符,后跟 a >

请注意,这也将匹配<foo>哪个不是电子邮件。要仅限于电子邮件(带有 的字符串@),您可以使用:

grep -Po '<\K[^>]+@[^>]+(?=>)' file 
Run Code Online (Sandbox Code Playgroud)