소스 코드로 작성된 이메일을 이해하는 방법을 찾으려고 노력 중입니다. 찾고 있는 정보를 얻기 위해 사용할 수 있는 방법을 찾았 grep
지만 구문에 익숙하지 않기 때문에 grep
앞으로 어떻게 사용할지 연구 중입니다. sed
내가 grep을 사용하는 이유는 다음과 같습니다.
grep [0-9a-zA-Z]@[0-9a-zA-Z] ./ -r | \
grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' | \
sort | uniq -c | sort -n
이 (두 번째) grep
표현은 온라인에서 발견되었으며 비교할 수 없는 내용이 많이 포함되어 있습니다.
지금까지 내 sed 표현은 다음과 같습니다.
grep -h [0-9a-zA-Z]@[0-9a-zA-Z] ./ -r | \
sed -nre 's/.*\([a-zA-Z0-9\.]*@[a-zA-Z0-9\.]*\).*/\1/p' | \
sort | uniq -c | sort -n
문제는 sed
정규 표현식이 탐욕적이라는 것입니다. 사용하려고 생각했지만 /expression/s/.*/\1/
일치 항목이 로 제한되어 있는 것 같아서 sed
찾을 수 없었습니다 .\1
.*
답변1
사용 grep
:
grep -rhoE '[[:alnum:].!#$%&'\''*+/=?^_`{|}~-]+@[[:alnum:].]+' .
아마도:
grep -rhoP '(?:[a-z0-9!#$%&'\''*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'\''*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])' .
질문에 관하여:
.*
하위 표현식에 사용된 문자 클래스를 부정하려고 시도하는 문자 클래스를 사용하지 마십시오 . 예를 들어:
sed -nE -e 's/[^[:alnum:]._-]*([[:alnum:]._-]+@[[:alnum:]._-]+)[^[:alnum:]._-]*/\1\
/gp'
답변2
grep -E
FWIW 나는 이 ERE를 사용합니다(따라서 , sed -E
, awk
, 등에서 작동합니다 perl
).
[0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}
정규 표현식 기반http://www.regular-expressions.info/email.html. 도구에서 지원하는 경우 단어 경계를 추가하세요. 샘플 입력/출력 없이 이메일 주소를 바인딩하는 다른 방법은 제안할 수 없습니다. 저는 특히 문자 클래스를 사용하지 않기 때문에 영어 알파벳만 얻습니다. 이것이 내 응용 프로그램에 가장 적합하기 때문입니다.