나는 이메일로 구성되어야 하는 매우 큰 데이터 세트를 가지고 있습니다. 그러나 파일에서 완전히 제거해야 하는 유효하지 않은 이메일이 많이 있습니다.
여기 몇 가지 예가 있어요.
89 is @msn .com
[email protected]
89%@yahoo.com
89%[email protected]
89':[email protected]
89'[email protected]
89'[email protected]
89&[email protected]
89+475asdjkl:[email protected]
89+475asdjkl;[email protected]
[email protected]
파일에서 유효하지 않은 이메일이 포함된 줄을 쉽게 제거할 수 있는 방법이 있습니까?
답변1
편집하다:지적한대로@ivannivan, 스크립트를 작성하지 않고도 grep에서 이 정규식을 사용할 수 있습니다.
grep "^[a-z0-9!#\$%&'*+/=?^_\`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_\`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?\$" my_email_list.txt >> my_valid_emails.txt
간단한 스크립트로 이 문제를 해결할 수 있습니다. 위에 댓글처럼@ilkkachu그리고@markplotnick, 그 중 일부 예는 완벽하게 유효한 이메일 주소입니다.
email_validate.sh:
#!/bin/bash
# email regex check
email_valid="^[a-z0-9!#\$%&'*+/=?^_\`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_\`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?\$"
# set field separator to new lines
IFS=$'\n'
# for loop checking line against regex above
for line in $(cat my_email_list.txt); do
if [[ $line =~ $email_valid ]]; then
echo "$line is valid"
else
echo "$line is invalid"
fi
done
예제 출력:
┌─[root@Fedora]─[~]─[03:27 pm]
└─[$]› ./email_validate.sh
89 is @msn .com is invalid
[email protected] is valid
89%@yahoo.com is valid
89%[email protected] is valid
89':[email protected] is invalid
89'[email protected] is invalid
89'[email protected] is invalid
89&[email protected] is valid
89+475asdjkl:[email protected] is invalid
89+475asdjkl;[email protected] is invalid
[email protected] is valid
실행 중인 파일에서 해당 항목을 제거해야 하는 경우 sed '/$line/d'
if 문을 추가하면 됩니다. 이전 파일을 참조해야 하는 경우를 대비해 유효한 이메일을 새 파일로 옮기는 것이 개인적으로 권장되지만
if [[ $line =~ $email_valid ]]; then
echo "$line is valid"
echo "$line" >> my_valid_emails.txt
else
echo "$line is invalid - deleting"
fi
그러면 다음과 같은 내용이 반환됩니다.
┌─[root@Fedora]─[~]─[03:34 pm]
└─[$]› cat my_valid_emails.txt
[email protected]
89%@yahoo.com
89%[email protected]
89&[email protected]
[email protected]