2013-03-28 61 views
0

我有一个主机文件,该文件是在以下格式:生成的正则表达式,从主机文件SED/AWK

# comments 

(ipv4/ipv6 address) (multiple hostnames) 
. 
. 
. 

我需要使用将它们转换为优化的正则表达式的bash/SED/AWK 。例如,如果我们有在主机文件执行以下操作:

127.0.0.1 abc.example.com def.examples.com 
127.0.0.1 ghi-example.com foobar.com 
127.0.0.1 malwaredomain.com malware-domain.com 

要被转换为:

(((abc|def)\.|ghi-)\.example\.com|foobar\.com|malware-?domain\.com) 

它可能是优选的也有一些智能转换。例如,如果我们有很多相似的条目,如:

127.0.0.1 ad-us.adserver.com ad-uk.adserver.com ad-fr.adserver.com ad-de.adserver.com 
127.0.0.1 ad-ru.adserver.com ad-ca.adserver.com ad-se.adserver.com ad-be.adserver.com 
... 

它们可以转化为ad\..*\.adserver.com,甚至为ad\..{2}\.adserver\.com。当然,像ad-(us|uk|fr|de|ru|ca|se|be)\.adserver\.com这样的工作,但我宁愿有一个通用的规则,因为有更多的检测服务器,可能会稍后添加的好处。

编辑:汇总,如果我有我有一个主机文件是这样的:

127.0.0.1 atmdt.com foo.atmdt.com bar.admdt.com 
127.0.0.1 anifkalood.ru boeing-job.com ilianorkin.ru humaniopa.ru 
127.0.0.1 hillairusbomges.ru mgithessia.biz justintvfreefall.org 

输出将涵盖以上所有服务器正则表达式:

((((foo|bar)\.?atmdt|boeing-job)\.com)|(anifkalood|hillairusbomges|ilianorkin|humaniopa)\.ru|mgithessia\.biz|justintvfreefall\.org) 

我怎么能acheive这个?

在此先感谢。

+0

Perl模块http://search.cpan.org/~manu/Net-IP-1.26/IP.pm可能很有趣 – cdarke 2013-03-28 11:26:30

+1

问题在于定义应该匹配/不应该匹配的限制。毕竟'。*'符合一般规则的要求,因为它会匹配任何条目!(你可以考虑优化) – cdarke 2013-03-28 11:30:44

+1

这个看起来像你想要的(优化)的实现通常是通过构建一棵树来完成的。 Bash(在未发布的4.3之前,它增加了ksh的namerefs)不支持指针或引用,这对于树来说是必需的,所以为了理性和合理的实现所需的设施不存在。忽略最短可能条件,你可以简单地将'.'实例(或者理想的情况下,任何未明确列入白名单的字符)转换为'[。]',在开始和结尾处添加一个'('和')'并用'|'分开,但是,那并不是那么有趣。 – 2013-03-28 11:40:54

回答

3

你似乎在寻找一个正则表达式生成器。这里有一些:

我会推荐遗传方法,但不确定它们的优化级别。

+1

是的,我选择了正则表达式生成器,但我会选择这个,而不是你发布的其他人:http://search.cpan.org/~dankogai/Regexp-Optimizer-0.15/lib/Regexp/List.pm – user2064000 2013-03-29 09:40:02

0

这看起来更像是一个计算机科学项目,而不是一个简单的编程问题!

我不认为你会发现任何简单的bash/sed/awk指令来做到这一点。您希望以编程方式创建正则表达式,sed/awk通常更适合,使用正则表达式。我想你必须看看approximate string matching,特别是计算两个字符串之间的Levenshtein distance