【问题标题】:tcl expect regular expression not working?tcl 期望正则表达式不起作用?
【发布时间】:2018-06-26 00:03:28
【问题描述】:

我试图期待不同类型的网络设备,但我无法制作更复杂的正则表达式。

对于我拥有的 Cisco 设备:

expect {"*>"}

* 工作正常

但对于 Fortinet 设备,我想这样做

expect {"^[a-zA-Z0-9_.-\s]+[#]"}

它不起作用。我检查了一个正则表达式“检查器”以确保表达式是正确的并且它似乎有效。所以基本上,我想过滤以“NAME_OF_DEVICE #”开头的行,因为这是你第一次连接到 Fortinet shell 时的样子

知道为什么它不起作用吗?

【问题讨论】:

  • 小贴士:在开发expect脚本时,在脚本顶部附近添加exp_internal 1。

标签: tcl expect


【解决方案1】:

来自manual:“正则表达式样式遵循 Tcl 的 regexp(“正则表达式”的缩写)命令定义的语法。正则表达式模式是通过标志 -re 引入的。”

你的例子:

expect -re {^[a-zA-Z0-9_.-\s]+#} ...

【讨论】:

  • 由于在字符类的中间使用破折号定义了一个字符范围,我另外建议将破折号放在模式的开头或结尾(如果你想从字面上匹配破折号),例如{^[-a-zA-Z0-9_.\s]+#}.
  • 也许我遗漏了一些东西,但现在我的 Cisco 和 Fortinet 期望都不起作用。
  • 在您的示例中,您重复引用了您的表达式。也许那会让你绊倒。你应该使用:expect -re {^[a-zA-Z0-9_.-\s]+#}(注意:没有引号),或者如果你真的想使用引号,expect {-re "^[a-zA-Z0-9_.-\s]+#"}(大括号内的-re)。您的 Cisco 表达式不是有效的正则表达式,因此不要在此处使用 -re 开关。
猜你喜欢
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多