我很难匹配从 cisco 路由器返回的模式。这是 sh run prefix-set xxx 命令的 $expect_out(buffer) 输出:
sh run prefix-set abc_123
RP/0/RSP0/CPU0:a1.rtr2#sh run prefix-set abc_123
RP/0/RSP0/CPU0:a1.rtr2#sh run prefix-set abc_123-99999-in
Fri Dec 6 21:12:16.863 GMT
prefix-set abc_123-99999-in
2.245.109.0/24 le 32,
2.245.196.0/22 le 32,
2.245.246.0/23 le 32,
2.245.248.0/23 le 32
end-set
!
Run Code Online (Sandbox Code Playgroud)
使用正则表达式,我想通过“end-set”匹配“prefix-set”,消除之前和之后的所有内容。
我正在寻找最终看起来像这样的数据:
prefix-set abc_123-99999-in
2.245.109.0/24 le 32,
2.245.196.0/22 le 32,
2.245.246.0/23 le 32,
2.245.248.0/23 le 32
end-set
Run Code Online (Sandbox Code Playgroud)
“abc_123-99999-in”和返回的前缀总是不同的。
我目前使用的代码:
expect "\r"
send_user ">>>>> Executing: sh run prefix-set $ccname <<<<\n"
#show prefix-set. \t tabs out the name for completion
send "sh run prefix-set $ccname\t\r"
expect "!\r"
if {[regexp {^.*Kprefix\-set.*$} $expect_out(buffer) pfx]} {
set pfx [string trimright $pfx]
puts $output "URL is: '$pfx'"
}
Run Code Online (Sandbox Code Playgroud)
关于如何清理返回的数据的任何想法?
谢谢!!
首先,假设: $expect_out(buffer) 的内容是一个带有嵌入换行符的单个字符串。如果是别的东西,我错了。
也就是说,您想使用正则表达式的功能使用括号 () 提取子字符串。尝试这个:
if {[regexp {.*(prefix\-set.*end\-set).*} $expect_out(buffer) tmp matchStr]} {
set matchStr [string map {"\n\n" "\n"} $matchStr]
}
Run Code Online (Sandbox Code Playgroud)
输入已加倍换行;string map 语句会将它们转换为单个换行符。
正则表达式会将匹配模式的子字符串放在 matchStr 中的括号中。($tmp 保存了整个输入字符串,因为 regexp 成功了。)如果需要,您可以使用多组括号来匹配输入中的多个符号。有关更多信息,请查看http://www.tcl.tk/man/tcl8.5/TclCmd/re_syntax.htm和http://wiki.tcl.tk/989。