2013-03-11 115 views
-1

我有一个简单的表达式(2Mb文件)的大列表。例如:
11.*;112.*;113.*;12.*;123.*正则表达式优化器

我需要删除不必要的表达式,并提出了这一点:
11.*;12.*

bash的版本,将不胜感激。在此先感谢

+0

你将哪些表情归类为“不必要”?所有3位数的编号表达式? – 2013-03-11 13:34:18

+1

@ Chirag64:'11. *'已经涵盖了'112. *'和'113. *'的情况,'12 *'已经涵盖了'123. *'的情况。简化为“11。*; 12. *'。 – nhahtdh 2013-03-11 13:35:49

+0

请更新您的问题1)表达式的语法(您在表达式中使用了哪些功能?)2)您尝试过什么? – nhahtdh 2013-03-11 13:37:45

回答

0

下面是一些Perl中,将工作,提供了您的模式的唯一通配符形式.*的:

#!/usr/bin/perl 
use strict; 
use warnings; 

my %terms; 
{ 
    local $/; 
    %terms = map {$_ => 1} split /;|\n/, <>; 
} 

foreach my $k1 (keys %terms) 
{ 
    foreach my $k2 (keys %terms) 
    { 
     if ($k1 ne $k2 and $k1 =~ /^$k2$/) 
     { 
      delete $terms{$k1}; 
      last; 
     } 
    } 
} 

print join ';', keys %terms; 

它会将您的文件作为命令行参数。

这是通过比较彼此的键。在每个比较中,一个键被视为一个字符串,另一个键被评估为正则表达式。这利用了.*匹配任何内容的事实 - 包括文字字符.*。因此,匹配另一个模式的文本字符串的表达式也将匹配模式匹配的所有字符串。

即使在单个模式中有多个.*条款,它也可以工作。例如,它正确地确定1.*1.*匹配11.*匹配的所有内容,删除后者。

但是,如果您引入其他正则表达式模式,这是一种简单的方法,并且将不会工作。对于这个问题一般没有简单的解决方案,因为你必须解析所有模式并找出每个模式匹配的内容。

+0

谢谢。奇迹般有效 – ky4k0b 2013-03-11 15:51:56