TCL/Expect regexp匹配多行输出

TCL/Expect regexp匹配多行输出,regex,tcl,expect,Regex,Tcl,Expect,我很难匹配从cisco路由器返回的模式。以下是sh run prefix set xxx命令的$expect_out(缓冲区)输出: 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

我很难匹配从cisco路由器返回的模式。以下是sh run prefix set xxx命令的$expect_out(缓冲区)输出:

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

!
使用regexp,我希望通过“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
“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'"
} 
expect“\r”

send_user“>>>>>正在执行:sh run prefix set$ccname首先,假设:$expect_out(buffer)的内容是一个带有嵌入换行符的字符串。如果是其他内容,我就错了

也就是说,您希望使用regexp的功能使用括号()拉出子字符串。请尝试以下操作:

if {[regexp {.*(prefix\-set.*end\-set).*} $expect_out(buffer) tmp matchStr]} {
    set matchStr [string map {"\n\n" "\n"} $matchStr]
}
输入有两个换行符;字符串映射语句将它们转换为单个换行符


Regexp将把匹配模式的子字符串放在matchStr的括号中。($tmp保存整个输入字符串,因为Regexp成功。)如果需要,可以有多组括号,匹配输入中的多个符号。有关详细信息,请查看和。

字符串映射{\n\n\n}…
操作的缺点是它只会减少空行的偶数倍。对于任意数量的空行,
lmap
regsub
操作更好。对于所讨论的字符串,还可以利用相关的“前缀集”字符串从行首开始的事实:

set noblanks [regsub -all {\n+} $expect_out(buffer) \n]
regexp -lineanchor ^prefix-set.*end-set $noblanks result
或者,更简洁地说:

regexp -lineanchor ^prefix-set.*end-set [regsub -all {\n+} $expect_out(buffer) \n] result
如果存在匹配项,
result
变量将被设置,否则将被取消设置(除非已经设置)。查看
regexp
调用的结果,或者测试
info exists result

% set result
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
文件: , , , ,

谢谢Erik。我明天会尝试一下并公布结果。我非常感谢你抽出时间!!太棒了。完全符合要求。非常感谢你,Erik!很高兴它对你有用。如果你喜欢,接受答案。:)哦,明白了。再次感谢。