Как я могу отфильтровать электронные письма от определенных доменов?

Из файла, содержа одно электронное письмо на строку, я попытался удалить домены в электронных письмах с помощью этой команды:

grep -viwE "(gmail.com|hotmail|yahoo|aol|rediffmail.com|msn|outlook|inbox.com|icloud.com|mail.com|zoho.com|yandex|live.)" * > dest.txt

Это однако также удаляет электронные письма, содержащие конкретные условия, подобные тому, что я дал в скобках.
Скажите, например, электронную почту: example@gmail.com & examplegmail.com@ff.com
Электронная почта example@gmail.com должен быть удален, но другой посылает по электронной почте, не должен. Вышеупомянутая команда удаляет обоих экземпляры, который не хорош. Как я могу избежать его?

Дополнительная сложность - то, что возможно кодирование ошибок произойдет.

-2
задан 12 February 2017 в 05:12

2 ответа

Вы могли использовать grep -f опция что-то вроде этого.

grep -vhf patternfile file file1

Помещенный весь Ваш шаблон в patternfile линию за линией как

@gmail.com
@hotmail
@yahoo
@aol
@rediffmail.com
..

, который опция -h, подавляет имя файла добавления префикса, когда больше чем один файл дан во входе.

0
ответ дан 7 November 2019 в 00:18

В крошечном сценарии:

#!/usr/bin/env python3
import sys

# list domains to be removed
rm = [
    'gmail.com', 'hotmail', 'yahoo', 'aol', 'rediffmail.com',
    'msn', 'outlook', 'inbox.com', 'icloud.com', 'mail.com',
    'zoho.com', 'yandex', 'live'
    ]
# read the file per line
for l in open(sys.argv[1]):
    # see if not any of the @domains is in the line
    if not any([d in l for d in ["@"+d for d in rm]]):
        # then print the line
        print(l.strip())

Использовать

  • Скопируйте сценарий в пустой файл как filter_doms.py
  • Выполните его с входным файлом как аргумент:

    python3 /path/to/filter_doms.py input_file > output_file 
    

Объяснение

Я полагаю, что код и комментарии объясняются :)


Согласно просьбе в комментарии, версия для игнорирования ошибок декодирования:

#!/usr/bin/env python3
import sys
import codecs

rm = [
    'gmail.com', 'hotmail', 'yahoo', 'aol', 'rediffmail.com',
    'msn', 'outlook', 'inbox.com', 'icloud.com', 'mail.com',
    'zoho.com', 'yandex', 'live'
    ]

with codecs.open(sys.argv[1], "r", encoding="utf-8", errors="ignore") as read:
    for l in read:
        if not any([d in l for d in ["@"+d for d in rm]]):
            print(l.strip())

Использование точно подобно

1
ответ дан 7 November 2019 в 00:18

Другие вопросы по тегам:

Похожие вопросы: