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]+)