带变量的 tcl 正则表达式
tcl regex with variables
我需要验证宣布默认路由的 IP 地址是什么:
set command [ exec "show ip route" ]
输出:
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override
Gateway of last resort is 10.17.1.252 to network 0.0.0.0
B* 0.0.0.0/0 [200/0] via 10.17.1.252, 01:16:22
10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 10.17.1.0/24 is directly connected, FastEthernet1/0
L 10.17.1.253/32 is directly connected, FastEthernet1/0
172.22.0.0/32 is subnetted, 1 subnets
C 172.22.12.250 is directly connected, Loopback1
172.26.0.0/16 is variably subnetted, 3 subnets, 2 masks
B 172.26.69.64/30 [200/0] via 10.17.1.252, 01:16:33
C 172.26.70.64/30 is directly connected, FastEthernet0/0
L 172.26.70.66/32 is directly connected, FastEthernet0/0
我需要找到这个:“0.0.0.0/0 [200/0] via 10.17.1.252”,但是这个地址:10.17.1.252 可以更改,我如何将变量放入正则表达式中?
set routes [ regexp {(0.0.0.0\/0 \[200\/0\] via $bgp_neighbor)} $command match default_route ]
你需要构建一个动态正则表达式,记住未转义的 .
匹配正则表达式中的任何字符,这就是为什么你需要 escape the dynamic part 在将它添加到正则表达式之前。
这是解决问题的方法($a
是保存文本的变量):
proc reEscape {str} {
regsub -all {\W} $str {\&}
}
set bgp_neighbor {10.17.1.252}
set bgp_neighbor_escaped [reEscape $bgp_neighbor]
set reg {\y0\.0\.0\.0/0 \[200/0] via }
append reg $bgp_neighbor_escaped
append reg {\y}
if {[regexp $reg $a]} {
puts yes
} else {
puts no
}
此处,$bgp_neighbor
保存 IP 地址。 $bgp_neighbor_escaped
是所有非单词字符都已转义的相同字符串(您实际上会将 .
替换为 \.
)。 \y
是词边界,为了避免在2222152.1.0.234444
.
中匹配152.1.0.23
请注意,您可以将所有文字空格替换为 \s+
以匹配任何 1+ 个空白字符。
正则表达式不是最好的选择。
string first [format {0.0.0.0/0 [200/0] via %s} $bgp_neighbor] $command
搜索零方差模式时,string first
是最接近的匹配项。使用 format
构建模式可最大程度地减少您需要执行的转义操作。
在这种情况下,无论如何都不需要转义:
string first "0.0.0.0/0 \[200/0] via $bgp_neighbor" $command
注意 string first
returns 字符串的位置,如果找到,或者 -1 如果没有找到。
文档:
string
我需要验证宣布默认路由的 IP 地址是什么:
set command [ exec "show ip route" ]
输出:
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override
Gateway of last resort is 10.17.1.252 to network 0.0.0.0
B* 0.0.0.0/0 [200/0] via 10.17.1.252, 01:16:22
10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 10.17.1.0/24 is directly connected, FastEthernet1/0
L 10.17.1.253/32 is directly connected, FastEthernet1/0
172.22.0.0/32 is subnetted, 1 subnets
C 172.22.12.250 is directly connected, Loopback1
172.26.0.0/16 is variably subnetted, 3 subnets, 2 masks
B 172.26.69.64/30 [200/0] via 10.17.1.252, 01:16:33
C 172.26.70.64/30 is directly connected, FastEthernet0/0
L 172.26.70.66/32 is directly connected, FastEthernet0/0
我需要找到这个:“0.0.0.0/0 [200/0] via 10.17.1.252”,但是这个地址:10.17.1.252 可以更改,我如何将变量放入正则表达式中?
set routes [ regexp {(0.0.0.0\/0 \[200\/0\] via $bgp_neighbor)} $command match default_route ]
你需要构建一个动态正则表达式,记住未转义的 .
匹配正则表达式中的任何字符,这就是为什么你需要 escape the dynamic part 在将它添加到正则表达式之前。
这是解决问题的方法($a
是保存文本的变量):
proc reEscape {str} {
regsub -all {\W} $str {\&}
}
set bgp_neighbor {10.17.1.252}
set bgp_neighbor_escaped [reEscape $bgp_neighbor]
set reg {\y0\.0\.0\.0/0 \[200/0] via }
append reg $bgp_neighbor_escaped
append reg {\y}
if {[regexp $reg $a]} {
puts yes
} else {
puts no
}
此处,$bgp_neighbor
保存 IP 地址。 $bgp_neighbor_escaped
是所有非单词字符都已转义的相同字符串(您实际上会将 .
替换为 \.
)。 \y
是词边界,为了避免在2222152.1.0.234444
.
152.1.0.23
请注意,您可以将所有文字空格替换为 \s+
以匹配任何 1+ 个空白字符。
正则表达式不是最好的选择。
string first [format {0.0.0.0/0 [200/0] via %s} $bgp_neighbor] $command
搜索零方差模式时,string first
是最接近的匹配项。使用 format
构建模式可最大程度地减少您需要执行的转义操作。
在这种情况下,无论如何都不需要转义:
string first "0.0.0.0/0 \[200/0] via $bgp_neighbor" $command
注意 string first
returns 字符串的位置,如果找到,或者 -1 如果没有找到。
文档: string