如何使用Expect内联将行解析为多个变量?

时间:2013-01-10 16:14:38

标签: parsing tcl expect

我正在尝试解析一行看起来像这样的文本:

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
    }
}

有什么想法吗?

3 个答案:

答案 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
}