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

时间:2012-08-17 18:19:03

标签: linux bash grep

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

3 个答案:

答案 0 :(得分:2)

您有太多grep个标记。具体来说:-x会阻止您获得所需的结果。

假设 file1 具有模式,并且 file2 具有URL,请使用:

grep -v -f file1 file2

-x标记会阻止您获得所需的结果:使用-x表示:仅匹配整条线,即只有线恰好与线匹配,例如: site2.com

来自man grep

  

-x, - line-regexp

     

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

答案 1 :(得分:1)

可能存在一些无法处理的极端情况,但您只需使用-v的{​​{1}}和-f选项:

grep

答案 2 :(得分: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;