假设我有两个文本文件。
第一个文件名 - “Emails.txt”,包含以下数据:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
第二个文本文件 - “Banned.txt”,包含以下字符串:
@gotmail.com
@cmail.com
@uor.edu
如果第一个文本文件“Emails.txt”中的所有行与第二个文本文件“Banned.txt”中任何一行的字符串匹配,如何删除它?
新文件的期望输出应该是:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
可以使用 Linux 中的 SED 或 awk 来完成此操作吗?您能建议如何执行此操作吗?
答案1
grep -v
就足够了。该标志-f
允许您执行您想要的操作:
grep -vf Banned.txt Emails.txt
如果您想在禁止地址列表中执行更复杂的操作,例如强制它们与整个域匹配,则需要从文件中生成正则表达式Banned
:
cat Banned.txt | tr "\n" "|" | sed -e 's,|,$\\|,g' | sed -e 's,\\|$,,'
给出了所需的
@gotmail.com$\|@cmail.com$\|@uor.edu$
然后:
cat Banned.txt | tr "\n" "|" | sed -e 's,|,$\\\\|,g' | sed -e 's,\\|$,,' | xargs -i grep -v '{}' Emails.txt
\
(在经过 时,转义符的数量会加倍,因为它们会被评估xargs
)。这将匹配并删除,[email protected]
但不会删除例如[email protected]
。