как grep между двумя строками в perl - PullRequest
0 голосов
/ 01 июня 2010

У меня есть 1 файл, который выглядит так

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 Ответ

1 голос
/ 01 июня 2010

Примерный код, приведенный ниже, выполняет последовательное совпадение, т. Е. Перемещается вниз по строке, чтобы извлечь нужные данные. Аналогичный код может быть использован для второй части вашего файла:

#!/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
...