0

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

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

Cisco IOS Software, C1240 Software (C1240-K9W7-M), Version 12.4(21a)JA1, RELEASE
SOFTWARE (fc1)

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

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

谢谢您的帮助

4

2 回答 2

4

你的问题是双重的。首先,Expect 不支持后视约束(嗯,不支持正常构建)。其次,您的正则表达式混淆了它使用的斜杠类型。在 Tcl 和(通过扩展)Expect 中将正则表达式放在大括号中总是一个好主意。当事情变得更长时,我还建议使用多行版本expect(如下所示),因为这样看起来更容易。

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

将东西放在大括号中的唯一缺点是 SO 格式错误。我想,我们可以挺过这样的困难……</sup>

于 2012-07-29T22:59:10.310 回答
3

原文

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

首先,正如 Donal 提到的,expect 不支持后视正则表达式......

此外,我认为您会发现在交互时匹配字符串并执行变量替换有点挑战。这很有可能,但这样做更容易......

建议

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"
于 2012-07-29T22:49:15.063 回答