perl正则表达式返回部分debian / ubuntu包名

时间:2013-08-22 20:17:29

标签: regex perl ubuntu debian

是否有正确识别和回馈的perl正则表达式技巧

  1. 包名称
  2. package upstream
  3. 包维护者版
  4. 并且可以使用任何ubuntu / debian包吗? (注意:任何)

    以下只是一个例子。 例如,sipcalc-1.2.3-1将被解析为:

    $1 = sipcalc
    $2 = 1.2.3
    $3 = 1
    

    libapache2-mod_perl-2.3.4-ubuntu5将被解析为

    $1 = libapache2-mod_perl
    $2 = 2.3.4
    $3 = ubuntu5
    

    包名和版本号是虚构的,这里只是想知道我需要什么。 并且,这也可以使用分割// 谢谢。

5 个答案:

答案 0 :(得分:1)

如果您希望将它们存储在单独的数组中,请使用:

#!/usr/bin/perl -w
use strict; 
use Data::Dumper;

    my @names = ('sipcalc-1.2.3-1', 'libapache2-mod_perl-2.3.4-ubuntu5', 'libapt-inst1.4-0.8.16~exp12ubuntu10.10','isc-dhcp-common-4.1.ESV-R4-0ubuntu5.8', 'libaprutil1-1.3.12+dfsg-3');

my (@var1, @var2, @var3);
foreach (@names) {
    my ($match1, $match2, $match3) = ($_ =~ /(.*)\-([\d\.]+)\W([a-z]*.*)/i);
        push @var1, $match1;
        push @var2, $match2;
        push @var3, $match3;
    }

print Dumper (\@var1);
print Dumper (\@var2);
print Dumper (\@var3);

输出:

 $VAR1 = [
          'sipcalc',
          'libapache2-mod_perl',
          'libapt-inst1.4',
          'isc-dhcp-common',
          'libaprutil1'
        ];
$VAR1 = [
          '1.2.3',
          '2.3.4',
          '0.8.16',
          '4.1',
          '1.3.12'
        ];
$VAR1 = [
          '1',
          'ubuntu5',
          'exp12ubuntu10.10',
          'ESV-R4-0ubuntu5.8',
          'dfsg-3'
        ];

答案 1 :(得分:0)

在我的系统上执行dpkg -l之后,我发现有很多看起来很独特的情况。

任何成功的正则表达式都必须考虑以下情况:

  

libapt-inst1.4-0.8.16〜exp12ubuntu10.10

     

libaprutil1-1.3.12 + DFSG-3

     

isc-dhcp-common-4.1.ESV-R4-0ubuntu5.8

毫无疑问其他一些奇怪的东西。

是否有某种指导这些包的命名?如果没有某种框架,考虑到包裹的数量,我认为不可能回答这个问题。

答案 2 :(得分:0)

#!/usr/bin/perl
use strict;
my @packages=`rpm -qa`;
foreach my $package ( @packages )
 {
   print "Package $package \n";
   my @parts = split(/\-/, $package);
   my $last=$#parts;
   my $maint_ver=$parts[$last];
   my $ver=$parts[$last-1];
   pop @parts; pop @parts;
   my $package_name=join("-",@parts);
   if ($ver !~ /\d+.\d+/ )
      {
       print "package naming error: $package \n";
      }
   print "$package_name <-> $ver <->  $maint_ver \n";
 }

答案 3 :(得分:-1)

“这也可以使用拆分//。”好像你有答案......

编辑:快速正则表达式。我不确定包的所有可能形式是什么。

use Data::Dumper;

my $string1 = "libapache2-mod_perl-2.3.4-ubuntu5";

my @matches = $string1 =~ m/([a-z0-9\-_]+)-([0-9.]+)-([a-z0-9]+)/i;

print Dumper \@matches;


$VAR1 = [
      'libapache2-mod_perl',
      '2.3.4',
      'ubuntu5'
    ];

答案 4 :(得分:-1)

编辑:请注意,只要您允许字段delemeter' - '进入字段内容 像这样 libapache2-mod_perl 所有的赌注都关闭了。您必须使用其他一些标准 打破田野。

我的猜测

 ^([^-]*)-([^-]*)-([^-]*)$

扩展

 ^
 ( [^-]* )
 -
 ( [^-]* )
 -
 ( [^-]* )
 $

或者是可变格式

 ^([^-]+)(?:-([^-]*)(?:-([^-]*))?)?$

扩展

 ^ 
 ( [^-]+ )        # (1)
 (?:
      -
      ( [^-]* )        # (2)
      (?:
           -
           ( [^-]* )        # (3)
      )?
 )?
 $