TCL/Expect regexp 匹配多行输出

use*_*033 3 regex tcl expect

我很难匹配从 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)

关于如何清理返回的数据的任何想法?

谢谢!!

Eri*_*son 5

首先,假设: $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.htmhttp://wiki.tcl.tk/989