【问题标题】:TCL/Expect regexp matching multiline outputTCL/Expect 正则表达式匹配多行输出
【发布时间】:2013-12-06 21:24:10
【问题描述】:

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

!

使用正则表达式,我想通过“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'"
} 

关于如何清理返回的数据有什么想法吗?

谢谢!!

【问题讨论】:

    标签: regex tcl expect


    【解决方案1】:

    首先,假设:$expect_out(buffer) 的内容是带有嵌入换行符的单个字符串。如果是别的,那我就错了。

    也就是说,您想使用正则表达式的能力来使用括号 () 提取子字符串。试试这个:

    if {[regexp {.*(prefix\-set.*end\-set).*} $expect_out(buffer) tmp matchStr]} {
        set matchStr [string map {"\n\n" "\n"} $matchStr]
    }
    

    输入的换行符增加了一倍;字符串映射语句会将它们转换为单个换行符。

    Regexp 会将匹配模式的子字符串放在 matchStr 的括号中。 ($tmp 保存整个输入字符串,因为 regexp 成功。)如果需要,您可以有多组括号,匹配输入中的多个符号。如需更多信息,请查看http://www.tcl.tk/man/tcl8.5/TclCmd/re_syntax.htmhttp://wiki.tcl.tk/989

    【讨论】:

    • 谢谢埃里克。明天我会试一试并发布结果。我非常感谢你的时间!
    • 太棒了。完全按要求工作。非常感谢,埃里克!
    • 很高兴它对你有用。如果喜欢,请采纳答案。 :)
    • 糟糕。明白了。再次感谢。
    【解决方案2】:

    string map {\n\n \n} ... 操作的缺点是它只能减少偶数个空行。对于任意数量的空行,lmapregsub 操作更好。对于有问题的字符串,还可以利用相关的“前缀集”字符串从行首开始这一事实:

    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
    

    文档: info, regexp, regsub, set, Syntax of Tcl regular expressions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多