编辑问题:我添加了第三个功能。我想出了一个似乎正确的正则表达式。 (第一和第二功能按预期工作。)
我已经编写了一些库中的函数,我从我的测试脚本中调用函数。我在使用正则表达式时遇到了一些问题。有人可以用正则表达式帮助我吗?
功能1:
sub ipsec_version {
my ($self) = @_;
my $cmd = 'sudo -s ipsec version ';
my $version = 0;
#execute the command
$self->execute($cmd);
foreach my $line ( @{ $self->get_stdout() } ) {
if ( $line =~ m/strongSwan/msx ) {
$version = $1;
}
}
return $version;
}
函数调用:
$self->{'ipsec_version'} = $self->{'ipsec_obj'}->ipsec_version();
INFO('[Startup] ipsec version is : ' . $self->{'ipsec_version'} );
实际输出:
Use of uninitialized value in concatenation (.) or string at ... line 37.
ipsec version is :
预期产出:
strongSwan U5.1.2/K3.16.0-30-generic
命令输出:
我需要脚本从此
中捕获预期的输出字符串Linux strongSwan U5.1.2/K3.16.0-30-generic
Institute for Internet Technologies and Applications
University of Applied Sciences Rapperswil, Switzerland
See 'ipsec --copyright' for copyright information.
功能2:
sub ipsec_status {
my ($self,$connection_name) = @_;
my $cmd = 'sudo -s ipsec status ' . $connection_name;
my $status = 0;
#execute the command
$self->execute($cmd);
foreach my $line ( @{ $self->get_stdout() } ) {
if ( $line =~ m/Security\sassociations\d\()/ ) {
$status = $1;
}
}
return $status;
}
函数调用:
$self->{'ipsec_status'} = $self->{'ipsec_obj'}->ipsec_status('connection');
('[Startup] ipsec status is : ' . $self->{'ipsec_status'} );
实际输出:
INFO [Startup] ipsec status is : 0
预期产出:
Security Associations (1 up, 0 connecting)
命令输出:
我需要脚本从此
中捕获预期的输出字符串Security Associations (1 up, 0 connecting):
connection[3]: ESTABLISHED 3 seconds ago, 1.1.1.19[1.1.1.19]...10.81.1.50[10.81.1.50]
connection{3}: INSTALLED, TUNNEL, ESP in UDP SPIs: cb343e86_i abf6d1f2_o
功能3:
sub ipsec_restart {
my ($self) = @_;
my $cmd = 'sudo -s ipsec restart';
my $restart = 0;
$self->execute($cmd);
foreach my $line ( @{ $self->get_stdout() } ) {
if ( $line =~ /(Starting strongSwan.*IPsec$)/ ) {
$restart = $1;
last;
}
}
return $restart;
}
函数调用:
$self->{'ipsec_restart'} = $self->{'ipsec_obj'}->ipsec_restart();
('[Startup] ipsec restart status is : ' . $self->{'ipsec_restart'} );
预期输出:请参阅下面突出显示的文字。 我签了https://regex101.com/。我的正则表达式似乎是正确的。 /(启动strongSwan。* IPsec $)/
Starting strongSwan 5.1.2 IPsec
Actual output is : 0
答案 0 :(得分:0)
问题是您使用的$1
只有在正在使用的正则表达式中有捕获时才会设置。此外,您应该添加last
,这样一旦找到匹配的行,就不会继续搜索匹配的行。最后,习惯性地将/m
,/s
和/x
修饰符添加到每个正则表达式匹配中是错误的,无论它们是否有任何区别,只需要前导m/
如果您使用的是默认斜杠分隔符以外的其他内容。
第一个功能应该包含
for my $line ( @{ $self->get_stdout } ) {
if ( $line =~ /(strongSwan.*\S)/i ) {
$version = $1;
last;
}
}
并且第二个功能类似,但看起来您似乎正在尝试匹配Security associations
后紧跟一个数字,这不是文本中的内容。您还有一个小a
而不是大写,如果您还使用/i
修饰符,则可以。这会捕获Security Associations
直到并包括同一行上的最后一个右括号。这就是你需要的吗?
for my $line ( @{ $self->get_stdout } ) {
if ( $line =~ /(Security\s+Associations.*\))/i ) {
$status = $1;
last;
}
}
答案 1 :(得分:0)
对于功能1,假设所有更改都是版本号,我们可以使用
m/(strongSwan.*?) Institute/ms
作为正则表达式。这将以非贪婪的方式匹配strongSwan
到Institute
之内的所有内容,并将Institute
中除$1
之外的所有内容存储在 m/(Security associations \(.*?\))/
中。
对于功能2,我们将使用未知数据包含在括号中的事实。
{{1}}