awk +文字間のEメールアドレスをキャプチャする方法

awk +文字間のEメールアドレスをキャプチャする方法

<と文字の間に長い電子メールリストがあります>

smeimebv2t <jdyefc@nsuwtcvc>; jdedyvt <ejd2ydt2@dv2dg2vgv>; didi2jd2m     <i2dmi32@hd2vdg >; 3idm23i2m <2udhu2@cdrrc>
.
.
.

awkまたはperl onelinerを使用して間のEメールアドレスのみをキャプチャするにはどうすればよいですか< >

例:

more results.out

jdyefc@nsuwtcvc
ejd2ydt2@dv2dg2vgv
i2dmi32@hd2vdg
2udhu2@cdrrc

答え1

私が考えることができる最も簡単な方法はGNUを使用することですgrep

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

これは-o「行の一致領域のみを印刷」を意味し、-PPerl準拠の正規表現を有効にします。これは\K、「これまでの一致を一致の一部として処理しない」という意味を使用してみましょう。肯定的な見通し。したがって、正規表現は文字<ではなく>文字と一致し、その後に>

これは<foo>電子メールでない場合でも一致します。電子メール(文字列を含む@)のみを制限するには、次のものを使用できます。

grep -Po '<\K[^>]+@[^>]+(?=>)' file 

答え2

perl -lne 'print for /<\K[^>]+/g'

答え3

ダイダイを使用してください:

awk -v RS="[<>]" '/@/' 

答え4

別の変形:

perl -lne 'print $1 while /<(.*?)>/g'

括弧がキャプチャされ、$1一致.*?が欲張りになりません。つまり、できるだけ早く停止します。

そしてawk

awk -F'<' '{ for(i = 2 ; i <= NF ; i++) { sub(/>.*/, "", $i); print $i; } } ' 

<sの行を分割し、最初の部分を無視し、sで始まるすべての項目を削除してから、別の部分を印刷します>。 a後ろに何もない場合は、>行の残りの部分が印刷されます<

関連情報