Из файла, содержа одно электронное письмо на строку, я попытался удалить домены в электронных письмах с помощью этой команды:
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
должен быть удален, но другой посылает по электронной почте, не должен. Вышеупомянутая команда удаляет обоих экземпляры, который не хорош. Как я могу избежать его?
Дополнительная сложность - то, что возможно кодирование ошибок произойдет.
Вы могли использовать grep
-f
опция что-то вроде этого.
grep -vhf patternfile file file1
Помещенный весь Ваш шаблон в patternfile
линию за линией как
@gmail.com
@hotmail
@yahoo
@aol
@rediffmail.com
..
, который опция -h
, подавляет имя файла добавления префикса, когда больше чем один файл дан во входе.
В крошечном сценарии:
#!/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())
Использование точно подобно