Regex Perl:在列表中搜索一个字符串,然后在它下面/后面搜索另一个字符串

Regex Perl:在列表中搜索一个字符串,然后在它下面/后面搜索另一个字符串,regex,perl,list,Regex,Perl,List,我的名单如下: Policy Name: PTCC-VNX7500-server_4A Options: 0x0 template: FALSE Schedule: MonthlyFull Type: FULL (0) Calendar sched: Enabled Allowed to retry after run day Last day of month

我的名单如下:

Policy Name:       PTCC-VNX7500-server_4A
Options:           0x0
template:          FALSE
Schedule:              MonthlyFull
  Type:                FULL (0)
  Calendar sched: Enabled
    Allowed to retry after run day
    Last day of month
  Maximum MPX:         1
  Synthetic:           0
  Retention Level:     11 (3 years)
为此,我需要提取“时间表:” (即时间表:每月整)

。。。然后是“保留级别”: i、 e.保留水平:11(3年) ... 无论此字符串(“保留级别:”)显示在“计划:””一词下面的何处

我想以这样的方式结束:

PTCC-VNX7500-server_4A,MonthlyFull,11 (3 years)
PTCC-VNX7500-server_4A,WeeklyFull,8 (4 weeks)
PTCC-VNX7500-server_4A,7_Year,1 (7 years)
我试图在这里和帕尔蒙克斯找到解决办法,但没有成功


谢谢

这里有一种方法:

use strict;
use warnings;

my @rec;

while(my $line=<DATA>) {
    if ($line =~ /Policy Name:|Schedule:|Retention Level:/) {
        chomp($line);
        my ($name, $value) = split /:\s*/, $line;
        push @rec, $value;
        if ($line =~ /Retention Level/) {
            local $"=",";
            print "@rec\n";
            @rec = ();
        }
    } 
}
__DATA__
Policy Name:       PTCC-VNX7500-server_4A
Options:           0x0
template:          FALSE
Schedule:              MonthlyFull
  Type:                FULL (0)
  Calendar sched: Enabled
    Allowed to retry after run day
    Last day of month
  Maximum MPX:         1
  Synthetic:           0
  Retention Level:     11 (3 years)
Policy Name:       PTCC-VNX7500-server_4A
Options:           0x0
template:          FALSE
Schedule:              WeeklyFull
  Type:                FULL (0)
  Calendar sched: Enabled
    Allowed to retry after run day
    Last day of month
  Maximum MPX:         1
  Synthetic:           0
  Retention Level:     8 (4 weeks)

您不指定此项,但假设每个计划都使用新的策略名称,则可以使用:

这将检查
策略名称:
后跟0+空格字符,然后捕获新行之前的所有内容。接下来,它延迟匹配任意数量的字符,直到
Schedule:
后跟0+个空格字符,然后捕获新行之前的所有内容。最后,它(令人惊讶地?)惰性地匹配任意数量的字符,直到
保留级别:
后跟0+空格字符,然后捕获到新行

如链接示例所示,这将为您提供3个组,其中包含策略名称、计划和保留级别。您需要全局修饰符(
g
)一次匹配多个策略,点匹配新行修饰符(
s
)允许
*
匹配换行符,还可以选择不区分大小写的修饰符(
i


如果一个策略名称下有多个计划,则可以使用:


这与此非常相似,我们只是将整个
策略名称:\s*([^\n]+).*?
部分包装在一个非捕获组中,并将其设置为可选。这意味着它不需要匹配。因此,第一个匹配将有3个捕获组(1:policy、2:schedule、3:retention),后续匹配可能只有2个捕获组(1:null、2:schedule、3:retention)。然后,您将使用您选择的语言来确定该匹配的策略名称(来自上一个匹配)。

根据您的预期输出,我假设您有多条
计划的记录。
策略名称
是否也会更改?问得好!计划更改,但策略名称保持不变。最后,我将遍历每个“策略名称”,并查找计划名称及其关联的保留级别。您能显示整个列表吗?我们似乎错过了几个日程安排项目。另外,我们是否需要同时研究多个策略?好吧,它看起来会非常类似于我前面的示例。基本上,每个条目总共有三个条目:策略名称1、日程1、保留级别1策略名称1、日程2、保留级别2策略名称1、日程3、保留级别3策略名称2、日程1、保留级别1策略名称2、日程2、保留级别2策略名称2、日程3、保留级别3。。。等等,非常感谢!那工作得很好。。。更重要的是,现在我知道下次自己怎么做了。@tyoung13不客气。如果有帮助,请不要忘记单击答案旁边的勾号,使其为绿色。
PTCC-VNX7500-server_4A,MonthlyFull,11 (3 years)
PTCC-VNX7500-server_4A,WeeklyFull,8 (4 weeks)
use strict;
use warnings;
use autodie;

my %record;
my $last_key;

while(<DATA>) {
    if (/^\s*(.*?):\s*(.*)/) {
        my ($k, $v) = ($1, $2);
        if ($k eq 'Policy Name' && %record) {
            print join(',', @record{('Policy Name', 'Schedule', 'Retention Level')}), "\n";
            %record = ();
        }
        $record{$k} = $v;
    }
}

print join(',', @record{('Policy Name', 'Schedule', 'Retention Level')}), "\n";

__DATA__
Policy Name:       PTCC-VNX7500-server_4A
Options:           0x0
template:          FALSE
Schedule:              MonthlyFull
  Type:                FULL (0)
  Calendar sched: Enabled
    Allowed to retry after run day
    Last day of month
  Maximum MPX:         1
  Synthetic:           0
  Retention Level:     11 (3 years)
Policy Name:       PTCC-VNX7500-server_123
Options:           0x0
template:          FALSE
Schedule:              SometimesEmpty
  Type:                FULL (0)
  Calendar sched: Enabled
    Allowed to retry after run day
    Last day of month
  Maximum MPX:         1
  Synthetic:           0
  Retention Level:     41 (8 years)
Policy Name:       PTCC-VNX7500-server_789
Options:           0x0
template:          FALSE
Schedule:              AlwaysBusy
  Type:                FULL (0)
  Calendar sched: Enabled
    Allowed to retry after run day
    Last day of month
  Maximum MPX:         1
  Synthetic:           0
  Retention Level:     17 (2 years)
PTCC-VNX7500-server_4A,MonthlyFull,11 (3 years)
PTCC-VNX7500-server_123,SometimesEmpty,41 (8 years)
PTCC-VNX7500-server_789,AlwaysBusy,17 (2 years)
Policy Name:\s*([^\n]+).*?Schedule:\s*([^\n]+).*?Retention Level:\s*([^\n]+)
(?:Policy Name:\s*([^\n]+).*?)?Schedule:\s*([^\n]+).*?Retention Level:\s*([^\n]+)