Bash,Linux,需要根据来自另一个文件的匹配内容从一个文件中删除行

在另一个文件中存在同一行时,如何删除一个文件中的行,有很多例子。 我已经通读了他们,如果全行匹配,他们全部删除。 例如: grep -vxF -f file1 file2

我所拥有的是稍有不同的。 我有我的网站和我的客户网站的url列表。 当域名与其他文件中的域名匹配时,我想从该文件中删除行。

所以第一个文件可能是这样的:

 http://www.site1.com/some/path http://www.site2.com/some/path http://www.site3.com/some/path http://www.site4.com/some/path 

第二个文件可能是:

 site2.com www.site4.com 

我想输出是:

 http://www.site1.com/some/path http://www.site3.com/some/path 

Solutions Collecting From Web of "Bash,Linux,需要根据来自另一个文件的匹配内容从一个文件中删除行"

你有太多的grep标志。 具体来说: -x会阻止你获得你想要的结果。

假设file1具有这些模式,而file2具有这些URL,只需使用:

 grep -v -f file1 file2 

-x标志将不让你得到你想要的结果:使用-x意味着:只匹配整条线,即只匹配一条线,如果线是完全的,例如site2.com

man grep

-x,–line-regexp

只选择完全匹配整行的匹配项。

可能有些情况不能处理,但是您可以简单地使用grep-v-f选项:

 grep -f file2.txt -v file1.txt 

以下应该工作(未经测试):

 #!/usr/bin/perl use strict; open my $fh, "<$ARGV[1]" || die $!; my $filter=join "|", <$fh>; close $fh; open $fh, "<$ARGV[0]" || die $!; print grep !m{^http://[^/]*($filter)/}x, <$fh>; close $fh;