<
와 문자 사이에 긴 이메일 목록이 있습니다 >
.
smeimebv2t <jdyefc@nsuwtcvc>; jdedyvt <ejd2ydt2@dv2dg2vgv>; didi2jd2m <i2dmi32@hd2vdg >; 3idm23i2m <2udhu2@cdrrc>
.
.
.
awk 또는 perl oneliner를 사용하여 사이의 이메일 주소만 캡처하려면 어떻게 해야 합니까 < >
?
예:
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 뒤에 아무것도 없으면 >
줄의 나머지 부분이 인쇄됩니다 <
.