我正在尝试解析一行看起来像这样的文本:
Blah blah A=1234 B=5678 C=9999 blah blah
我想使用该行的值填充三个变量A B和C.
理想情况下,我想使用看起来像这个伪代码的expect脚本:
file.exp:
expect {
"*A=" $A " B=" $B " C=" $C " *\r\n"
}
显然这不会运行,但你可以看到我正在尝试做什么。我知道我可以做类似下面代码的事情,但这是很多打字而不是可读:
expect {
* {
set line split $expect_out(buffer) " "
set A lindex (split (lindex $line 3) "=") 1
set B lindex (split (lindex $line 4) "=") 1
set C lindex (split (lindex $line 5) "=") 1
}
}
有什么想法吗?
答案 0 :(得分:4)
如果您不知道调用的变量名称是什么,那么这是非常通用的:
expect {
-re {(\w+)=(\S+)} {
lappend variables $expect_out(1,string)
set $expect_out(1,string) $expect_out(2,string)
exp_continue
}
eof
}
foreach varname $variables {puts "$varname=[set $varname]"}
您应该根据需要更改eof
条件 - 期望块将落入无限循环(取决于您的超时值)而没有适当的退出条件。
此外,我的正则表达式不适用于具有空格的值,例如: X="a string"
。显然这取决于您期望遇到的情况。
答案 1 :(得分:3)
这是一种方法:
expect -re {^.*A=(\d+)\s+B=(\d+)\s+C=(\d+).*$} {
set A $expect_out(1,string)
set B $expect_out(2,string)
set C $expect_out(3,string)
# Do something with $a, $b, and $c
}
-re
标志告诉expect使用正则表达式,并将结果解析为$expect_out(1,string)
,...
答案 2 :(得分:1)
Tcl的“scan”命令就像sscanf一样工作:
expect * {
scan $expect_out(buffer) "A=%i B=%i C=%i" A B C
}