2017-12-13 7 views
1

私はExpectスクリプトでtelnetを実行しています。TCLで検索すると、変数名を使用しても応答が取得されません。

expect -re {02 : (.*?)\s} 
set output $expect_out(1,string) 
puts "output is $output" 

=>出力される3(これが正しい答えである)

set tests "02 : " 

expect -re {"$tests"(.*?)\s} 
set output $expect_out(1,string) 
puts "output is $output" 

=>出力2(他の値であり、この値はで古い値が存在します他のテキストの検索に使用された$ expect_out(1、string)

検索するテキストを保存することはできますか?変数はexpect-re {....}になりますか? テキストを変数で検索してから、その変数をexpectに渡します。

これを試しましたが、機能しませんでした。

expect -re {($tests)(.*?)\s} 
+0

あなたの本能が正しいと私はあなたが答えを得ることを期待...しかし___用心!!! ___枚でのREを構築する際には注意する必要があります。それは少し簡単です - これは、\S*で実現することができます。 –

答えて

2

あなたの問題は、変数が中括弧内で展開されていないことです。代わりにこれを試してみてください:

puts {"$tests"(.*?)\s} 
# Output: "$tests"(.*?)\s 
puts "${tests}(.*?)\\s" 
# Output: 02 : (.*?)\s 

括弧が$testsの値の代入を防ぎ、だけではなく、正規表現としてリテラル$testsを置く:

expect -re "${tests}(.*?)\\s" 

は違いを比較してください。引用符は実際には$testsの値を取得することを保証します。それ以外の場合は、変数拡張の一部として扱われるため、追加のブレースを追加しました(${tests}にする)。

+0

これをより困難にすることができる「期待」についての特色がありますが(それは状況によっては「賢い」ものです)、ここで言うように動作しなければなりません。 –

+0

ありがとう非常に...このソリューションは働いた.. –

1

@ user108471の回答があります。ここでは正規表現を構築するための選択肢のカップルです:

set tests "02 : " 
set suffix {(.*?)\s} 
set regex [string cat $tests $suffix] 

expect -re $regex 
set output $expect_out(1,string) 
puts "output is $output" 

これは、あなたが(string catコマンドが導入されました)のTcl 8.6.2上に構築することを期待必要があります。また、あなたが望むように見えるexpect -c 'puts [info patchlevel]'

で検証します非空白文字は(.*?)\sです。

set regex "${tests}(\\S*)" 
+0

私はまだこれをテストしています..ありがとう –

関連する問題