如何计算正则表达式捕获组中的匹配数-Perl



我需要一种方法来计算正则表达式捕获组中使用Perl或Bash的匹配数。我可以用Powershell来做这件事,但不能用这两种语言中的任何一种。你们帮我的Regex工作,但我看到的每个例子都只是打印捕获组。打印比赛结果对我没有帮助,我需要计算每组比赛的次数。

以下是regexing的示例数据(这是命令的输出,因此不是静态数据,也不是来自文件(

JobID           Type State Status               Policy Schedule     Client Dest Media Svr Active PID
41735         Backup  Done      0     Policy_name_here    daily hostname001 MediaSvr1       8100
41734         Backup  Done      0     Policy_name_here    daily hostname002 MediaSvr1       7803
41733         Backup  Done      0     Policy_name_here    daily hostname004 MediaSvr1       7785
41732         Backup  Done      0     Policy_name_here    daily hostname005 MediaSvr1       27697
41731         Backup  Done      0     Folicy_name_here    daily hostname006 MediaSvr1       27523
41730         Backup  Done      0     Policy_name_here    daily hostname007 MediaSvr1       27834
41729         Backup  Done      0     Policy_name_here        - hostname008 MediaSvr1       27681
41728         Backup  Done      0     Policy_name_here        - hostname009 MediaSvr1       27496
41727 Catalog Backup  Done      0              catalog     full hostname010 MediaSvr1       27347
41712 Catalog Backup  Done      0              catalog        - hostname004                 30564 

我不能使用命名捕获组,因为我正在使用Perl5.8.5

我的正则表达式

/(d+)?s+((b[^dW]+b)|(b[^dW]+bs+b[^dW]+b))?s+((Done)|(Active)|(w+w+-w-+))?s+(d+)?s+((w+)|(w+_w+)|(w+_w+_w+))?s+((b[^dW]+b-b[^dW]+b)|(-)|(b[^dW]+b))?s+((w+.w+.w+)|(w+))?s+((w+.w+.w+)|(w+))?s+(d+)?/g

每个捕获组对应一列,我需要将捕获组的结果拉到一个变量中,这样我就可以使用某种where {$var -eq '0'}.count代码进行计数。假设Status -eq '0'表示成功备份,我需要计算Status捕获组中成功备份的数量。

最终输出类似

Statistic.SUCCESSFUL: 20

我已经使用Powershell实现了这一点,但Perl完全不同,Bash似乎受到了限制。如果有人知道如何用这两种语言中的任何一种来完成上述任务,我将不胜感激。

诚挚的问候,

DJ-

<>;  # Skip header
my $successes = 0;
while (<>) {
chomp;
my @row = /.../
or do {
die("Line $. doesn't match patternn");
next;
};
++$successes if $row[3] eq '0';
}

您也可以命名列。

<>;  # Skip header
my $successes = 0;
while (<>) {
chomp;
my %row;
@row{qw( JobID Type State Status ... )}  = /.../
or do {
die("Line $. doesn't match patternn");
next;
};
++$successes if $row{Status} eq '0';
}

最后,如果您想将数据存储在数据结构中以供以后分析,这也是可能的。

<>;  # Skip header
my @rows;
while (<>) {
chomp;
my %row;
@row{qw( JobID Type State Status ... )}  = /.../
or do {
die("Line $. doesn't match patternn");
next;
};
push @rows, %row;
}
my $successes = grep { $_->{Status} eq '0' } @rows;

最后,regex模式是。。。很坏的我会选择这样的东西:

sub trim(_) { $_[0] =~ s/^s++|s++z//rg }
my $pattern;
my @headers;
{
my $header_line = <>;
chomp($header_line);
$header_line =~ s/bDest Media Svrb/Dest_Media_Svr/;
$header_line =~ s/bActive PIDb/Active_PID/;
$pattern = join '', map { "A".length($_) } $header_line =~ /s*S+/g;
@headers = map trim, unpack $pattern, $header_line;
}
my @rows;
while (<>) {
chomp;
my %row; @row{@headers} = map trim, unpack $pattern, $_;
push @rows, %row;
}
my $successes = grep { $_->{Status} eq '0' } @rows;

最新更新