如何在perl中的两行之间进行grep

时间:2010-06-01 08:52:07

标签: perl perl-module

我有一个看起来像这样的文件

COMPANY=xyz
system.employee[0].Name=shayam
system.employee[0].Age=26
system.employee[0].sex=Male
system.employee[1].Name=ram
system.employee[1].Age=28
system.employee[1].sex=Male

COMPANY=bhg
system.employee[0].Location=Bangalore
system.employee[0].Number=26
system.employee[1].Location=chennai
system.employee[1].Number=28

我希望与公司xyz组成一个表格,其中列名称,年龄,性别以及另一个表格列位置&数。 你能帮我解决一下使用perl的方法吗?输出应该是这样的

COMPANY xyz 

Name     Age    Sex

Shayam   26     Male

Ram      28     Male


COMPANY bgh

Location     Number

Bangalore      26

Chennai        28

由于

1 个答案:

答案 0 :(得分:1)

下面的粗略代码执行渐进式匹配,即它向下移动字符串以提取所需的数据。类似的代码可用于文件的第二部分:

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

my $inline;
{
    local $/ = undef;    #turn on slurp mode
    $inline = <DATA>;
}

print "COMPANY xyz\nName Age sex\n";    #Report header

$inline =~ s/^COMPANY=xyz\n(.*)COMPANY=bhg/$1/msx;    #strip off surplus text to
$inline =~ s/system\.employee\[\d+\]\.//gx;    #simplify progressive match below

while (
    $inline =~ /
(?:                 #start of non capturing block
    Name=(.*)\n
    Age=(.*)\n
    sex=(.*)\n
){1}            # end of non-capturing block (progressive match)
/gmx    # g=progressive match, m=multiline match x=comments
  )
{
    print "$1 $2 $3\n";
}

__DATA__
COMPANY=xyz
system.employee[0].Name=shayam
system.employee[0].Age=26
system.employee[0].sex=Male
system.employee[1].Name=ram
system.employee[1].Age=28
system.employee[1].sex=Male

COMPANY=bhg
system.employee[0].Location=Bangalore
system.employee[0].Number=26
system.employee[1].Location=chennai
system.employee[1].Number=28