0

Cisco の「show version」コマンドの出力からファームウェア バージョンを取得する方法について教えてください。

次は、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

あなたの問題は2つあります。まず、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 に答える