匹配具有特定开始和结束字/字符的数组的模式

时间:2013-07-22 09:32:36

标签: perl

在数组中有一些输出,我试图从输出以特定单词开始的位置拉出细节,并以特定的单词/字符结束。然后将此输出打印到屏幕上。

我正在使用的数组中的输出是:

router rip
 version 2
 redistribute bgp 45134 metric 3
 passive-interface Serial1/3:1.333
 passive-interface Serial3/1:3.333
 passive-interface Serial3/1:5.333
 passive-interface Serial3/2:1.333
 passive-interface Serial3/4:1.333
 passive-interface Serial3/4:17.333
 passive-interface Serial6/1:1.333
 no auto-summary
 !
 address-family ipv4 vrf TestVRF-0001
 redistribute bgp 45134 metric 3
 network 10.0.0.0
 no auto-summary
 version 2
 exit-address-family
 !

到目前为止我生成的perl代码如下:

    elsif ( $action eq "show_vrf1" ) {
            my $cmd = "show run | begin router rip";
            my @lines = $s->cmd(String => $cmd,
                            Prompt  => "/$enableprompt/",
                            Timeout => 10);
            foreach my $line (@lines) {
                if(/address-family ipv4 vrf TestVRF-0001.*?!/){
                $result=$1;
                print $result;
                }
            }
    }

我只想将数据中的以下内容拉出来:

 address-family ipv4 vrf TestVRF-0001
 redistribute bgp 45134 metric 3
 network 10.0.0.0
 no auto-summary
 version 2
 exit-address-family
 !

由于某种原因,当我运行脚本时,我只是得到一个空白屏幕,没有从数组中提取数据。

2 个答案:

答案 0 :(得分:1)

                if($line =~ /address-family ipv4 vrf TestVRF-0001.*?!/){

而不是

                if(/address-family ipv4 vrf TestVRF-0001.*?!/){

答案 1 :(得分:0)

您将$ line与正则表达式匹配。您期望的输出不在一行上,因此没有行可以匹配它。

您可以将整个多行字符串存储在标量中:

my $output = join q(), $s->cmd(...);

然后,如果使用括号来真正捕获字符串的一部分,则可以检索输出:

if ($output =~ /(address-family ipv4 vrf TestVRF-0001.*?!)/s) {
    my $result = $1;

请注意,需要使用/s修饰符才能使点匹配换行符,但它通常不会。\ / p>