Приветствую, коллеги! С праздником! :-)
Итак, поставлена вполне прикладная задача: не принимать от маркетологов списки рассылки, в которых содержится множество непроверенных (в т.ч. - путём простого считывания) адресов email.
Сами адреса попадают в списки от девочек-вводисток, которые читают вручную запоненные анкеты и вколачивают оттуда данные в какую-то первичную Excell-подобную систему (а то и в сам Эксель). Грязь и ошибки, которые при этом возникают, как легко догадаться, самые разные:
- забыла «собаку»
- поставила запятую вместо точки
- забыла переключить язык
- задела мизинцем какой-то непечатный символ
- и т. п.
При этом, как вы понимаете, от нас ожидают организации успешной рассылки по всем предоставленным адресам (ну мы же - Боги, сделаем что-нибудь).
Не теряя надежду когда-нибудь подтянуть навыки персонала дружественного департамента маркетинга до минимально приемлемого уровня, принял решение автоматизировать первичный анализ качества исходного материла силами sed.
Разумеется, предварительно просмотрел, кто и как к этой задаче подходил до меня и понял, что создавать прийдётся самому. Иначе как обяснить, что кто-то, прочитав коротенький раздел 3.4.1. Addr-spec specification RFC2822 в итоге пришёл к чему-то вроде
((([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)|("(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]|[\x21\x23-\x5B\x5D-\x7E])|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*"))@(([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)|(\[(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]|[\x21-\x5A\x5E-\x7E])|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*\])))
Итого имеем две заготовки скриптов в Bash:
- Выборка только годных адресов
- Выбрка НЕгодных адресов с целью, со всей деликатностью и доброжелательностью, но всё же ткнуть в них носом коллег-маркетологов
Мои попытки привели меня к следующим результатам. В первом случае:
#!/bin/bash
[[ -f "$1" ]] || { echo "File not found: $1"; exit 0; }
/usr/bin/sed 's/[[:blank:]]//g;/^$/d;' "$1" | sed -n '/^[a-zA-Z0-9_.-]\+@[a-zA-Z0-9_.-]\+\.[a-zA-Z]\+$/p' | /usr/bin/sort -u > "$1.clean"
И - во втором (по сути - зеркальном первому):
#!/bin/bash
[[ -f "$1" ]] || { echo "File not found: $1"; exit 0; }
/usr/bin/sed 's/[[:blank:]]//g;/^$/d;' "$1" | /usr/bin/sed '/^[a-zA-Z0-9_.-]\+@[a-zA-Z0-9_.-]\+\.[a-zA-Z]\+$/d' "$1" | /usr/bin/sort -u | /usr/bin/sed = | /usr/bin/sed 'N;s/\n/\t/'
Осознавая всю мощь и, как следствие, опасность скрытых ошибок sed надеюсь услышать подсказки и рекомендации коллег по данному вопросу.
P.S. Предвижу встречный вопрос из аудитории: «а что ты дурью мучаешься, если знаешь, что большинство спам-мейлеров сами проводят предварительную проверку списков адресов перед началом рассылки?!» Отвечу: мы планируем автоматизировать данный процесс через создание набора простых и надёжных скриптов, (по-возможности) полностью исключив интерактив с живым сотрудником. Да и не очень-то я доверяю этим роботам-спамерам ;-)
Заранее признателен за конструктивные комментарии.