1

我正在尝试解析如下所示的单行文本:

废话 A=1234 B=5678 C=9999 废话

我想用该行的值填充三个变量 AB 和 C。

理想情况下,我想使用一个类似于以下伪代码的期望脚本:

文件.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
    }
}

有任何想法吗?

4

3 回答 3

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条件——在没有适当退出条件的情况下,expect 块将陷入无限循环(取决于您的超时值)。

此外,我的正则表达式不适用于带有空格的值,例如X="a string". 显然,这取决于您期望遇到的情况。

于 2013-01-10T21:16:14.717 回答
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), ...

于 2013-01-10T19:48:55.753 回答
1

Tcl 的“scan”命令和 sscanf 一样工作:

expect * {
    scan $expect_out(buffer) "A=%i B=%i C=%i" A B C
}
于 2013-01-10T17:43:01.110 回答