TCL/Expect 正则表达式匹配多行输出

3

我在匹配从思科路由器返回的模式时遇到了困难。这里是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

!

使用正则表达式,我想匹配"prefix-set"到"end-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'"
} 

有什么想法可以清理返回的数据吗?
谢谢!!
2个回答

5
首先,有一个假设:$expect_out(buffer)的内容是一个带有嵌入换行符的单个字符串。如果它是其他东西,则我是错误的。
话虽如此,您想要使用regexp的能力使用括号()提取子字符串。请尝试这个:
if {[regexp {.*(prefix\-set.*end\-set).*} $expect_out(buffer) tmp matchStr]} {
    set matchStr [string map {"\n\n" "\n"} $matchStr]
}

输入中有重复的换行符,字符串映射语句将把它们转换为单个换行符。
正则表达式会将匹配模式的子字符串放在括号中并存储在matchStr中。($tmp保存了整个输入字符串,因为正则表达式匹配成功)。如果需要匹配多个符号,可以使用多组括号。欲了解更多信息,请查看http://www.tcl.tk/man/tcl8.5/TclCmd/re_syntax.htmhttp://wiki.tcl.tk/989

谢谢Erik。我明天会尝试并发布结果。非常感谢你的时间! - user3076033
太棒了。完全按照要求工作。非常感谢你,Erik! - user3076033
很高兴它对你有用。如果你喜欢的话,请接受这个答案。 :) - Erik Johnson
糟糕,抓住你了。再次感谢。 - user3076033

0

string map {\n\n \n} ...操作的缺点是它仅能减少偶数个空行。对于任意数量的空行,可以使用或操作更好。对于所涉及的字符串,还可以利用相关的“前缀集”字符串从行开始的事实:

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

文档: 信息, 正则表达式, 替换正则表达式, 设置, Tcl正则表达式语法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接