我是一名编程技能有限的networking工程师,我使用了一个名为dnGREP的工具,它基于NET4.0,用于在普通文本文件中search文本。 作为我工作的一部分,我需要做的是find适用于任何接口configuration的命令。
我的想法是试图find两个项目限制正确的REGEX。 但是在尝试构build高效的REGEX时遇到了一些问题。
从思科设备的“show running-configuration”中取出以下string:
interface GigabitEthernet0/0/0/1.1982 ipv4 address 10.111.193.125 255.255.255.252 ipv4 unreachables disable load-interval 30 dot1q vlan 1982 ! interface GigabitEthernet0/0/0/1.1983 ipv4 address 10.113.193.125 255.255.255.252 ipv4 unreachables disable load-interval 30 dot1q vlan 1983 ! interface GigabitEthernet0/0/0/2.1982 ipv4 address 10.111.193.129 255.255.255.252 ipv4 unreachables disable load-interval 30 find me dot1q vlan 1982 !
正如你所看到的,接口configuration可以被2个项目限制。
开始项目:
interface
结束项目:
!
给定一个string,我想要一个REGEX匹配string以及接口上下文。
条件:
这是我到目前为止的REGEX:
^interface([\s\S]*?)find me([\s\S]*?)!
分解:
^界面 – “开始search时,”界面“是行的开始。”
([\ s \ S] *?—-“search包含新行的任何字符”
find我—-“find我是我正在寻找的string/命令”
([\ s \ S] *?!—-“继续打印直到find!
当然,以上REGEX不会做我期望的。 它应该只返回这个:
interface GigabitEthernet0/0/0/2.1982 ipv4 address 10.111.193.129 255.255.255.252 ipv4 unreachables disable load-interval 30 find me dot1q vlan 1982 !
相反,它返回所有的东西后,第一个界面被发现这不是我想要的。
我知道这是为什么发生,但我不知道如何纠正。
“当find第一个接口时,正则expression式开始寻找find我 ,但是当findstring时,如果没有findstring,应该停止 。声明不匹配但是它应该继续,直到文件结束并且打印所有包含接口上下文的接口上下文stringfind我 “
我希望我的解释清楚。 任何帮助真的很感激=)。
尝试下面的正则表达式:
interface\s*(?<text>[^!]+find me[^!]+)(?:!)?
说明:
interface\s*
– “界面”一词,后跟0个或多个空格;
(?<text>[^!]+find me[^!]+)
– 包含除“!”之外的任何字符,1次或更多次重复以及字符串“find me”的组text
。
(?:!)?
– 匹配 ”!” 字符,但不捕捉它,0或1个重复(为了迎合最后一段,如果字符丢失)。