0

当同一行存在于另一个文件中时,有很多关于如何删除一个文件中的行的示例。我已经通读了它们,如果整行匹配,它们都会被删除。例如: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
4

3 回答 3

2

grep你的旗帜太多了。具体来说:-x将使您无法获得想要的结果。

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

grep -v -f file1 file2

-x标志将使您无法获得您想要的结果:使用-x意味着:仅与整行匹配,即仅在该行完全匹配时才匹配该行,例如site2.com

来自man grep

-x, --line-正则表达式

仅选择与整行完全匹配的匹配项。

于 2012-08-17T18:22:47.247 回答
1

可能有一些极端情况无法处理,但您可以简单地使用-v-f选项grep

grep -f file2.txt -v file1.txt
于 2012-08-17T18:22:57.153 回答
0

以下应该有效(未经测试):

#!/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;
于 2012-08-17T18:27:26.450 回答