Regex 正则表达式从Cisco IOS`显示版本检索固件版本号`

Regex 正则表达式从Cisco IOS`显示版本检索固件版本号`,regex,tcl,expect,cisco,cisco-ios,Regex,Tcl,Expect,Cisco,Cisco Ios,我需要从Cisco“show version”命令的输出获取固件版本的帮助 以下是显示版本输出的第一行(其中“12.4(21a)JA1”是固件版本): 下面的代码给出了错误:无法编译正则表达式模式:量词操作数无效 expect "*#" {send "show version\n"} expect -re "(?<=Version/s)(.*)(?=/sRELEASE)" {set var1 $expect_out(1,string)} puts "Firmware Version: $v

我需要从Cisco“show version”命令的输出获取固件版本的帮助

以下是显示版本输出的第一行(其中“12.4(21a)JA1”是固件版本):

下面的代码给出了错误:无法编译正则表达式模式:量词操作数无效

expect "*#" {send "show version\n"}
expect -re "(?<=Version/s)(.*)(?=/sRELEASE)" {set var1 $expect_out(1,string)}
puts "Firmware Version: $var1"
expect“*#”{send“show version\n”}

expect-re“(?原件

expect "*#" {send "show version\n"}
expect -re "(?<=Version/s)(.*)(?=/sRELEASE)" {set var1 $expect_out(1,string)}
puts "Firmware Version: $var1"
expect "*#" {send "show version\n"}
expect "*#" {send "# something else here"}
regexp {Version\s(\d.+?),\sRELEASE\sSOFTWARE} $expect_out(buffer) matched var1
puts "Firmware Version: $var1"

您的问题有两个方面。首先,Expect不支持look-behind约束(在正常构建下不支持)。其次,您的正则表达式混淆了它使用的斜杠类型。在Tcl和(扩展)中,将正则表达式放在大括号中总是一个好主意Expect。我还建议在事情变得更长时使用多行版本的
Expect
(如下所示),因为这对眼睛来说要容易得多

expect "*#" {send "show version\n"}
expect {
    -re {Version\s+(.*),\s+RELEASE} {
        set firmwareVersion $expect_out(1,string)
    }
}
puts "Firmware Version: $firmwareVersion"

将东西放在大括号中的唯一缺点是格式错误。我们可以经受住这样的困难,我认为…

重建Tcl以使用PCRE作为其重新引擎是可能的-尽管目前这不是一个受支持的配置,甚至不是Tcl主源代码树中的任何内容(我知道有一个商业实验)-如果这样做了,那么Expect可能仍然可以正常工作。或者它可能不工作;Expect使用了许多更模糊的功能,非常难驱动重新引擎。+1我要提到的是,由于他正在与Cisco交互,他还需要在Expect中查找提示……因此我的建议顺便说一句,您的正则表达式需要限制为
因为
*
太贪婪了,攫取的东西远远超出了需要……我会使用
(\d.+?),
@Mike去非贪婪并没有你想象的那么多帮助;Expect会在数据进来时应用模式,所以说保持匹配空间小并没有真正的好处。(如果有很多使用数据流中的“
Version
”,或者如果有两个“
RELEASE
”字,但可能性不大。)最好使用
(\s*)
因为这不太可能匹配一段很长的文本,但这并不重要,因为匹配空间也受先前匹配的提示限制。我假设他可以找到提示;我根本不知道Cisco设备(除了声誉)。匹配一行上的字符串并不太难。多行匹配可以…令人兴奋…但Cisco
show version
输出需要多行匹配才能同时获得版本号和提示
expect "*#" {send "show version\n"}
expect {
    -re {Version\s+(.*),\s+RELEASE} {
        set firmwareVersion $expect_out(1,string)
    }
}
puts "Firmware Version: $firmwareVersion"