我正在寻找一个与下面的输出中的“vserver foo2”匹配的perl正则表达式。但是,我想返回匹配的行,以及以下所有行到“!”我只想打印“vserver foo2”的配置 谢谢你的帮助!
Cisco配置:
!
vserver foo1
描述foo
虚拟1.1.1.1 tcp www
serverfarm foofoo
持续的再平衡
在职
!
vserver foo2
说明foo2
虚拟1.1.1.2 tcp www
serverfarm foofoo2
持续的再平衡
在职
!
vserver foo3
说明foo3
虚拟1.1.1.3
serverfarm foo3
复制csrp连接
持续的再平衡
在职
!
答案 0 :(得分:7)
perl -ne 'print if /^vserver foo2/ .. /^!/' config.txt
答案 1 :(得分:1)
open IN, '<', '1.txt';
while(<IN>) {
if (/^vserver foo2$/) { $found = 1 }
last if (/^!$/ and $found);
print if $found
}
答案 2 :(得分:1)
假设$ content包含所有文件,那么您应该执行以下操作:
my ($config) = $content =~ m/\n!\n(vserver foo2[^!]*)/sm;
假设你没有'!'在你的配置中的某个地方。
但是,我认为更好的方法是运行循环,并跳过正则表达式: 假设$ fh是文件句柄:
my $line;
# cut the leading lines
do {
$line = <$fh>;
chomp $line;
while ($line ne "!");
while ($line = <$fh>) {
chomp $line;
my $found = ($line eq "vserver foo2");
while ($line = <$fh>) {
chomp $line;
break if $line eq "!";
say $line if $found;
}
break if $found;
}
答案 3 :(得分:0)
匹配字符串vserver foo2
的正则表达式很简单:/vserver foo2/
。
为此问题获取多行的最简单方法可能是在加载此文件时覆盖input record separator
变量$/
,以便每条记录(“!”之间的所有内容)都是保持在一个标量中。例如,
local $/ = "!\n";
open my $fh, '<', $cisco_config_file;
my @configurations = <$fh>;
现在@configurations
的每个元素都包含整个记录。要获得匹配的记录,现在只需说明
my @matching_records = grep { /vserver foo2/ } @configurations;