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

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

假设我有两个文本文件。

第一个文件名 - “Emails.txt”,包含以下数据:

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

第二个文本文件 - “Roles.txt”,包含以下字符串:

sale@
info@
all@
help@

如果第一个文本文件“Emails.txt”与第二个文本文件“Role.txt”中任何一行的字符串仅精确匹配,如何删除其中的所有行?

新文件的期望输出应该是:

[email protected]
[email protected]

我尝试使用

grep -vf Role.txt Emails.txt

但是,如果该命令与 Role.txt 的所有字符匹配,它也会删除该行。

我只想删除与 Role.txt 文件完全匹配的内容,如果所需字符串之前有其他字符,则删除所有内容。

这里有人给出了类似的解决方案,用于删除每行末尾的精确匹配字符串,但在此我需要正则表达式在每行开头都相同。

答案1

第二个文件应如下所示:

^sale@
^info@
^all@
^help@

因为^匹配一行的开头。

您可以使用 重建文件sed -i 's/^/^/' Role.txt。需要明确的是:这将更改文件。然后您的原始命令

grep -vf Role.txt Emails.txt

将工作。


或者,原来的 Role.txt在支持进程替换的 shell 中(例如 Bash):

grep -vf <(sed 's/^/^/' Role.txt) Emails.txt

在这种情况下,动态sed添加字符并且保持不变。^Role.txt

相关内容