2010-06-01 22 views
-1

我有1個文件,它看起來像這樣如何在Perl

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公司的列名,年齡,性別和一個多個表的列位置的表兩條線之間的grep &數量。 你能幫助我如何達致這用perl的輸出應該是這樣的

 
COMPANY xyz 

Name  Age Sex 

Shayam 26  Male 

Ram  28  Male 


COMPANY bgh 

Location  Number 

Bangalore  26 

Chennai  28 

感謝

+0

如果我grep「COMPANY =」之間的界限,我可以實現這一目標。如何grep grep兩個關鍵字之間的界限? – Raj 2010-06-01 08:53:52

+0

您可以添加所需的示例輸出嗎? – Space 2010-06-01 09:03:09

+0

輸出中就應該像公司表= XYZ姓名年齡性別shayam 26男 拉姆28男 公司= BHG位置號碼班加羅爾26奈28 感謝 – Raj 2010-06-01 09:21:54

回答

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