1

次のような1行のテキストを解析しようとしています:

何とか何とか A=1234 B=5678 C=9999 何とか何とか

AB と C の 3 つの変数に、その行の値を入力します。

理想的には、次の疑似コードのようなスクリプトを期待して使用したいと思います。

ファイル.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

これを行う1つの方法は次のとおりです。

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_out(1,string)、...

于 2013-01-10T19:48:55.753 に答える
1

Tclの「スキャン」コマンドはsscanfと同じように機能します。

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