-1

我有一大堆简单的表达式(2Mb 文件)。例如:
11.*;112.*;113.*;12.*;123.*

我需要删除不必要的表达式并想出这个:
11.*;12.*

bash 版本将不胜感激。提前致谢

4

1 回答 1

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.*匹配的内容,删除后者。

但是,这是一种 hacky 的简化,如果您引入其他正则表达式模式,它将不起作用。一般来说,这个问题没有简单的解决方案,因为您必须解析所有模式并找出每个模式匹配的内容。

于 2013-03-11T14:18:52.620 回答