正则表达式,它在另一个特定字符串下查找字符串的所有实例

时间:2017-07-11 15:33:14

标签: regex

我不确定这是否可以在单个正则表达式中使用,或者我是否需要两个。

我有一个看起来像的字符串:

route-table arlrt2
 rg arlrg2
 route testroute p 1.0/24 np 10.4
 route route2 p 1.0/24 np 10.4
 route route3 p 1.0/24 np 10.4
route-table arlrt3
 rg arlrg2
 route testroute p 1.0/24 np 10.4
 route route2 p 1.0/24 np 10.4
 route route3 p 1.0/24 np 10.4
route-table arlrt3
 rg arlrg2
 route testroute p 1.0/24 np 10.4
 route route2 p 1.0/24 np 10.4
 route route3 p 1.0/24 np 10.4

我想提取特定路线表的路线信息。理想情况下,我会有一个包含例如" testroute p 1.0 / 24 np 10.4"等字符串的路由列表。

我找到了如何获得所有路线

  (route .*\s)

或如何在路线表下获得单一路线

route-table arlrt2\s.*\s*( route .*\s)

但是我似乎无法弄清楚如何在路由表下找到所有路由。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您想匹配路由表部分,请执行以下操作:

^route-table(?:.*\s*){5}$

在线测试:

^route-table(?:.*\s*){5}$

可能会对您有所帮助,您应该注意匹配依赖于 fix-line-size ;这里 {5} 。此外,它将输入视为:多行模式。当然,我们可以使用 lazy star .*?进行单行模式,如下所示:

^route-table(?:.*?$\s*){5}$

试验:

^route-table(?:.*?$\s*){5}$

你要解析,这是一个 Perl单行解决方案,我假设你有一个看起来像这样的输入:

##############################
other stuff
##############################
route-table arlrt2                       // line 1
 rg arlrg2                               // line 2
 route testroute p 1.0/24 np 10.4        // line 3
 route route2 p 1.0/24 np 10.4           // line 4
 route route3 p 1.0/24 np 10.4           // line 5
##############################
other stuff
##############################
route-table arlrt3
 rg arlrg2
 route testroute p 1.0/24 np 10.4
 route route2 p 1.0/24 np 10.4
 route route3 p 1.0/24 np 10.4
##############################
other stuff
##############################
route-table arlrt3
 rg arlrg2
 route testroute p 1.0/24 np 10.4
 route route2 p 1.0/24 np 10.4
 route route3 p 1.0/24 np 10.4
##############################
other stuff
##############################

解析仍依赖于fix-line-size,此处为5

现在,为了访问这些部分(= route-table(s)),我们可以:

perl -lne '$s=$.;($e=$s+5) if/route-table/g; print if $s++<$e' file  

输出:

route-table arlrt2
 rg arlrg2
 route testroute p 1.0/24 np 10.4
 route route2 p 1.0/24 np 10.4
 route route3 p 1.0/24 np 10.4
route-table arlrt3
 rg arlrg2
 route testroute p 1.0/24 np 10.4
 route route2 p 1.0/24 np 10.4
 route route3 p 1.0/24 np 10.4
route-table arlrt3
 rg arlrg2
 route testroute p 1.0/24 np 10.4
 route route2 p 1.0/24 np 10.4
 route route3 p 1.0/24 np 10.4

然后,for:单个路由表下的所有路由,最好解析成列表

您可以在!/(?:route-table|rg)

推送

所以:

perl -ne '$s=$.;($e=$s+5) if/route-table.*?$/g && ($rt=$&); push(@L,$_) if $s++<$e && !/(?:route-table|rg)/;if($s==$e){print @L;@L=()}' file  

输出:

 route testroute p 1.0/24 np 10.4 #1
 route route2 p 1.0/24 np 10.4 #1
 route route3 p 1.0/24 np 10.4 #1
 route testroute p 1.0/24 np 10.4 #2
 route route2 p 1.0/24 np 10.4 #2
 route route3 p 1.0/24 np 10.4 #2
 route testroute p 1.0/24 np 10.4 #3
 route route2 p 1.0/24 np 10.4 #3
 route route3 p 1.0/24 np 10.4 #3

请注意,我添加了{#1#2以及#3)以澄清输出。

每个route都位于@L,您可以通过

访问它们

全部:@L
一些(第一和第二):@L[0,1]

如果您愿意看到单行中的输出未分隔的行,您可以添加-l选项以影响输出分隔符

所以:

perl -lne '$s=$.;($e=$s+5) if/route-table.*?$/g && ($rt=$&); push(@L,$_) if $s++<$e && !/(?:route-table|rg)/;if($s==$e){print @L;@L=()}' file

有输出:

 route testroute p 1.0/24 np 10.4 #1 route route2 p 1.0/24 np 10.4 #1 route route3 p 1.0/24 np 10.4 #1
 route testroute p 1.0/24 np 10.4 #2 route route2 p 1.0/24 np 10.4 #2 route route3 p 1.0/24 np 10.4 #2
 route testroute p 1.0/24 np 10.4 #3 route route2 p 1.0/24 np 10.4 #3 route route3 p 1.0/24 np 10.4 #3

如果您注意到,我将匹配$&的结果存储到变量$rt中,您可以稍后在第二个if条件下使用它。例如,为输出标题,例如:

... print "$rt =>",@L;@L=()}' file  

输出:

route-table arlrt2 => ...
route-table arlrt3 => ...
route-table arlrt3 => ...

最终我确信您可以使用

实现这个简单的脚本