Perl匹配数组中的特定单词

时间:2014-04-18 13:32:47

标签: regex perl

需要快速perl脚本的帮助。我在Linux机器上有很多配置,我使用grep,egrep等将它存储在一个数组中。

打印数组@unix会得到以下结果:

abc-xyz-1a.conf-virtual Hey {
abc-xyz-1a.conf-virtual How {
abc-xyz-1a.conf-virtual where {
abc-xyz-1b.conf-virtual Hey {
abc-xyz-1b.conf-virtual How {
abc-xyz-1b.conf-virtual where {

现在,如果你看看这个输出,我正在寻找一个正则表达式给我2个可能的东西。

首先是设备名称,这里我们可以看到有2种设备名称

abc-xyz-1a  and abc-xyz-1b 

其次,在虚拟"嘿",""如何"之后有不同类型的名称。 ,"其中"等。

我需要在一个无法做到的变量中提取这些值。

仅供参考,当我打印unix[0]时,它会给出第一行,即

abc-xyz-1a.conf-virtual Hey {

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

这样的事情应该有效:

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

while ( <DATA> ) {
   my ($device, $word) = /([a-z0-9-]+)\Q.conf-virtual\E\b(.+)\b/;
   print "Device: $device -- Word: $word\n";
}

__DATA__
abc-xyz-1a.conf-virtual Hey {
abc-xyz-1a.conf-virtual How {
abc-xyz-1a.conf-virtual where {
abc-xyz-1b.conf-virtual Hey {
abc-xyz-1b.conf-virtual How {
abc-xyz-1b.conf-virtual where {

正则表达式细分:

# capture 1, match one or more of a lowercase letter, number, or dash
([a-z0-9-]+)

# \Q disables meta characters
# match .conf-virtual literally
# \E enables meta characters again 
\Q.conf-virtual\E

# \b word boundary
# (.+) capture 2, match one or more of anything
# \b word boundary
\b(.+)\b

答案 1 :(得分:0)

您可以使用哈希表来记录这些信息,如下所示:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %record;

while (<DATA>) {
    chomp;
    my ($key, undef, $val) = split /\.|\s+/;
    push @{$record{$key}}, $val;
}

print Dumper(\%record);

__DATA__
abc-xyz-1a.conf-virtual Hey {
abc-xyz-1a.conf-virtual How {
abc-xyz-1a.conf-virtual where {
abc-xyz-1b.conf-virtual Hey {
abc-xyz-1b.conf-virtual How {
abc-xyz-1b.conf-virtual where {

测试:

$ perl t02.pl 
$VAR1 = {
          'abc-xyz-1a' => [
                            'Hey',
                            'How',
                            'where'
                          ],
          'abc-xyz-1b' => [
                            'Hey',
                            'How',
                            'where'
                          ]
        };