我一直在自学期望值脚本,我还有一些关于expect脚本regex表达式的澄清问题。我已经创建了一个代码,生成一个SNMP会话,然后启用iLOM代理。事实证明,iLOM2和iLOM3处理这个过程的方式不同,所以我创建这个脚本来解决这个问题。在试图找出如何正确匹配正则表达式时,我在网上遇到了许多相互冲突的解决方案,现在我很困惑。我找到的最好的帮助是期望手册。我设法得到了一些工作,但我担心我的解决方案是肮脏的,它不符合我找到的任何一个例子。所以我的实际问题是:我的代码是如何工作的?有更好的办法吗?
我希望了解更多关于Expect脚本的知识,而不是只是盲目地将定制解决方案划分在一起。
注意:再次声明,这段代码可以工作。我想知道它是如何评估的。
捕获的产出:
spawn ssh -o StrictHostKeyChecking=no root@<host>
Password:
Sun(TM) Integrated Lights Out Manager
Version 2.0.2.6
Copyright 2008 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
->其想法是捕捉“版本2”。然后从那里提取数字2。
期望脚本片段:
set prompt "\\\->"
send "$pwd\r"
expect {
timeout { ...timeout action... }
$prompt { ...regex didn't match action... }
-indices -re {(Version (\d+).)} {
#Regex to find ILOM Version.
if {[info exists expect_out(2,string)]} {
set ilom_version $expect_out(2,string)
} else { ...regex didn't match properly action... }
expect $prompt
}
}确切的正则表达式是-indices -re { (\d+).)}。我花了很长时间才最终找到一个有效的语法,因为我上面链接的expect手册中有一些完全不同的示例。ie:每当我采用那种语法时,-re就会“failed\”,所有的东西都会分崩离析。“版本”、版本、{版本}、(版本)都失败。
因此,我想我只是困惑于我的代码是如何工作的,以及为什么它与我找到的所有示例如此不同。如有任何意见或建议,将不胜感激。谢谢您抽时间见我。
发布于 2013-03-01 18:58:48
正则表达式是用{}括起来的。
(Version (\d+).)它将匹配一个包含Version的字符串,后面跟着一个空格,然后是一个或多个数字,后面跟着任何字符中的一个。点是与任何字符匹配的通配符;如果要匹配文字.,请使用\.。
您已经在()中封装了该模式,因此整个匹配将被捕获并保存在expect_out(1,string)中。但是,作为a)您没有使用整个匹配,和( b)整个匹配是自动保存在expect_out(0,string)中的,所以外部括号是不必要的。
您还将\d+括在括号中,因此版本号的前导数字将被捕获并保存在expect_out(2,string)中,但是如果您删除了上面建议的外括号,它将保存在expect_out(1,string)中。
数字后面的.或\.并不真正起到任何作用,除非在没有该字符的情况下阻止匹配。
-indices标志是不必要的,因为您不是在寻找匹配的索引。
否则,您提取版本号的方法看起来很好--不过,我几乎不知道Expect :)
https://stackoverflow.com/questions/15163987
复制相似问题