这是我的输出:
Signal Quality = 100
Signal Strength = -49
Noise Level = -96
我正在尝试获取所有三个数值(即100,-49,-96)。我将添加和减去这些值,所以我需要各自的变量?
这些数字是动态的,可能是负数。
使用下面的代码,我当时可以抓一个,但是如何抓住所有3个数字呢?
expect {
-re {Strength = +(.*)\s+Noise} {
set RSSI $expect_out(1,string)
}
puts "Signal Strength = $RSSI"
感谢您的帮助!
答案 0 :(得分:2)
要在一次expect
通话中获取所有三个值,您需要一点点技巧。
# Initialize to an empty array
unset myAry
array set myAry {}
# Now let's expect some stuff!
expect {
-re {(\w+)\s+=\s+(-?\d+)} {
# Found it; stuff in an array
set myAry($expect_out(1,string)) $expect_out(2,string)
# TRICKY! Keep waiting if we've not yet got all three values
if {[array size myAry] < 3} {
exp_continue
}
}
}
使用衍生流程的输出,将myAry(Quality)
设置为100
,将myAry(Strength)
设置为-49
,将myAry(Level)
设置为-96
}。要使用这两个单词,请将其用作模式:
{(\w+\s+\w+)\s+=\s+(-?\d+)}
然后你可能想要剥离空格:
set key [string map {{ } {}} $expect_out(1,string)]
set myAry($key) $expect_out(2,string)
# Now that optionally-keep-waiting stanza from above
当然,这可以是一个单行。我通常不喜欢我的台词。
答案 1 :(得分:0)
不确定tcl正则表达式,但这样的事情可能会奏效
这些数字按顺序位于捕获组1,2,3中
需要Dot-All或添加(?s)
或将“.
”更改为[\S\s]
# Quality\s*=\s*([+-]?\s*\d+)\s*.*?Strength\s*=\s*([+-]?\s*\d+).*?Level\s*=\s*([+-]?\s*\d+)
Quality \s* = \s*
( [+-]? \s* \d+ ) # (1)
\s*
.*?
Strength \s* = \s*
( [+-]? \s* \d+ ) # (2)
.*?
Level \s* = \s*
( [+-]? \s* \d+ ) # (3)