0

我有一个主机文件,格式如下:

# comments

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

我需要使用 bash/sed/awk 将它们转换为优化的正则表达式。例如,如果我们在 hosts 文件中有以下内容:

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)

我怎样才能做到这一点?

提前致谢。

4

2 回答 2

3

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

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

于 2013-03-28T11:54:36.223 回答
0

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

我认为您不会找到任何直接的 bash/sed/awk 指令来执行此操作。您想以编程方式创建正则表达式,而 sed/awk 通常更适合使用正则表达式。我想您必须研究近似字符串匹配,特别是计算两个字符串之间的Levenshtein 距离。

于 2013-03-28T11:36:03.530 回答