"sed"를 사용하여 전체 줄을 일치하는 하위 문자열로 바꾸는 방법

"sed"를 사용하여 전체 줄을 일치하는 하위 문자열로 바꾸는 방법

소스 코드로 작성된 이메일을 이해하는 방법을 찾으려고 노력 중입니다. 찾고 있는 정보를 얻기 위해 사용할 수 있는 방법을 찾았 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 -EFWIW 나는 이 ERE를 사용합니다(따라서 , sed -E, awk, 등에서 작동합니다 perl).

[0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}

정규 표현식 기반http://www.regular-expressions.info/email.html. 도구에서 지원하는 경우 단어 경계를 추가하세요. 샘플 입력/출력 없이 이메일 주소를 바인딩하는 다른 방법은 제안할 수 없습니다. 저는 특히 문자 클래스를 사용하지 않기 때문에 영어 알파벳만 얻습니다. 이것이 내 응용 프로그램에 가장 적합하기 때문입니다.

관련 정보