如果第一个文件的行与 Linux 中第二个文件中的字符串匹配,我该如何删除它?

如果第一个文件的行与 Linux 中第二个文件中的字符串匹配,我该如何删除它?

假设我有两个文本文件。

第一个文件名 - “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]

相关内容