我有一个主机文件,该文件是在以下格式:生成的正则表达式,从主机文件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这个?
在此先感谢。
Perl模块http://search.cpan.org/~manu/Net-IP-1.26/IP.pm可能很有趣 – cdarke 2013-03-28 11:26:30
问题在于定义应该匹配/不应该匹配的限制。毕竟'。*'符合一般规则的要求,因为它会匹配任何条目!(你可以考虑优化) – cdarke 2013-03-28 11:30:44
这个看起来像你想要的(优化)的实现通常是通过构建一棵树来完成的。 Bash(在未发布的4.3之前,它增加了ksh的namerefs)不支持指针或引用,这对于树来说是必需的,所以为了理性和合理的实现所需的设施不存在。忽略最短可能条件,你可以简单地将'.'实例(或者理想的情况下,任何未明确列入白名单的字符)转换为'[。]',在开始和结尾处添加一个'('和')'并用'|'分开,但是,那并不是那么有趣。 – 2013-03-28 11:40:54