在perl中如何在两行之间进行grep
我有一个像这样的文件在perl中如何在两行之间进行grep,perl,perl-module,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.em
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
COMPANY xyz
Name Age Sex
Shayam 26 Male
Ram 28 Male
COMPANY bgh
Location Number
Bangalore 26
Chennai 28
我想与xyz公司组成一个表,其中包含列名称、年龄、性别,还有一个表包含列位置和编号。
您能帮助我如何使用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
COMPANY xyz
Name Age Sex
Shayam 26 Male
Ram 28 Male
COMPANY bgh
Location Number
Bangalore 26
Chennai 28
xyz公司
姓名年龄性别
沙亚姆26男
公羊28公
bgh公司
位置号
班加罗尔26
钦奈28
谢谢下面的粗略代码进行渐进匹配,即它向下移动字符串以提取所需的数据。类似代码可用于文件的第二部分:
#!/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
#/usr/bin/perl-w
严格使用;
使用警告;
我的$inline;
{
本地$/=undef;#打开slurp模式
$inline=;
}
打印“公司xyz\n名称年龄性别\n”#报表标题
$inline=~s/^COMPANY=xyz\n(.*)COMPANY=bhg/$1/msx#将多余的文本剥离到
$inline=~s/system\.employee\[\d+\]\.//gx#简化下面的渐进匹配
当(
$inline=~/
(?:#非捕获块的开始
名称=(.*)\n
年龄=(.*)\n
性别=(.*)\n
){1} #非捕获块结束(渐进匹配)
/gmx#g=渐进匹配,m=多行匹配x=注释
)
{
打印“$1$2$3\n”;
}
__资料__
公司=xyz
system.employee[0]。Name=shayam
system.employee[0]。年龄=26
system.employee[0]。性别=男性
system.employee[1]。Name=ram
system.employee[1]。年龄=28
system.employee[1]。性别=男性
公司=bhg
system.employee[0]。位置=班加罗尔
system.employee[0]。编号=26
system.employee[1]。位置=钦奈
system.employee[1]。编号=28
如果我将“COMPANY=”之间的行变灰,我可以实现这一点。如何在grep中grep两个关键字之间的行?可以添加所需的示例输出吗?输出应该是类似COMPANY=xyz Name Age sex shayam 26 Male Ram 28这样的表Male COMPANY=bhg位置号班加罗尔26钦奈28 ThanksI无法在此处设置视图。表名应该是company=xyz,列是name-Age-sex,条目应该出现在该列下。还有一个名为company=bhg的表,该表的列是Location和Number。编辑您的问题并添加所需的格式。