使用正则表达式从列表中删除重复的域

时间:2010-02-17 12:49:05

标签: regex string text uri

我想使用PCRE获取URI的列表并将其提取出来。

开始

http://abcd.tld/products/widget1       
http://abcd.tld/products/widget2    
http://abcd.tld/products/review    
http://1234.tld/

完成

http://abcd.tld/products/widget1
http://1234.tld/

任何想法,亲爱的StackOverflow成员?

5 个答案:

答案 0 :(得分:5)

您可以使用简单的工具,例如uniq

请参阅评论中的kobi示例:

grep -o "^[^/]*//[^/]*/" urls.txt | sort | uniq

答案 1 :(得分:2)

虽然它的效率很低,但可以做到......

(?<!^http://\2/.*?$.*)^(http://(.*?)/.*?$)

请不要使用此

答案 2 :(得分:1)

使用URI库解析域,然后将其插入哈希。您将写入已存在于该哈希中的任何URL,这样您最终将获得唯一链接。

这是一个Ruby示例:

require 'uri'

unique_links = {}

links.each do |l|
  u = URI.parse(l)
  unique_links[u.host] = l
end

unique_links.values # returns an Array of the unique links

答案 3 :(得分:0)

如果您可以将整个文件作为单个字符串使用,而不是逐行处理,那么为什么不应该这样做呢? (我不确定char范围。)

s!(\w+://[a-zA-Z0-9.]+/\S+/)([^ /]+)\n(\1[^ /]+\n)+!\1\2!

答案 4 :(得分:0)

如果你的系统有(g)awk

awk -F"/" '{
 s=$1
 for(i=2;i<NF;i++){ s=s"/"$i }
 if( !(s in a) ){ a[s]=$NF }
}
END{
    for(i in a) print i"/"a[i]
} ' file

输出

$ ./shell.sh
http://abcd.tld/products/widget1
http://1234.tld/