<
と文字の間に長い電子メールリストがあります>
。
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
「行の一致領域のみを印刷」を意味し、-P
Perl準拠の正規表現を有効にします。これは\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後ろに何もない場合は、>
行の残りの部分が印刷されます<
。