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