从一个每行包含一封电子邮件的文件中,我尝试使用以下命令删除电子邮件中的域:
grep -viwE "(gmail.com|hotmail|yahoo|aol|rediffmail.com|msn|outlook|inbox.com|icloud.com|mail.com|zoho.com|yandex|live.)" * > dest.txt
但是,它还会删除包含特定术语的电子邮件,类似于我在括号中给出的内容。
例如电子邮件: [email protected]
&[email protected]
该电子邮件[email protected]
应该被删除,但其他电子邮件不应该被删除。上述命令删除了这两个实例,这不好。我该如何避免这种情况?
额外的复杂因素是可能会发生编码错误。
答案1
在一个很小的脚本中:
#!/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())
使用方法完全相同
答案2
您可以使用类似这样的选项grep
。-f
grep -vhf patternfile file file1
将所有图案patternfile
逐行放入
@gmail.com
@hotmail
@yahoo
@aol
@rediffmail.com
..
-h
当输入中给出多个文件时,该选项是抑制前缀文件名。