我想在使用Expect脚本时获取确切的数字。看看这段代码:
spawn /opt/nsr/nsr_adv_config.sh create
expect "*Your selection:*"
puts "[ exec echo '$expect_out(buffer)' | grep "Generic (Other)" | sed 's/[[:blank:]]*//' | sed 's/ .*//' ]"
nsr adv config.sh create 的输出现在是:
Please select one (number) from the list below.
1 C-NTDB DSA node - Apertio database
2 C-NTDB DBM node - Hypersonic database
3 C-NTDB PGW node - CommandLog files
4 IS-Linux (ISL) - Linux Installation Server for C-NTDB nodes
5 Generic (Other)
-> Your selection:
我想要的是在 Generic(Other)之后获取提取的数字,然后使用它作为您的选择发送,所以我的首选输出只是 5 。在bash上我的grep和sed工作正常,但我想知道如何使用Expect的exec命令工作。
我现在收到的错误是:
invalid command name ":blank:"
while executing
":blank:"
invoked from within
"[:blank:]"
invoked from within
"exec echo '$expect_out(buffer)' | grep "Generic (Other)" | sed 's/[[:blank:]]*//' | sed 's/ .*//' "
invoked from within
"puts "[ exec echo '$expect_out(buffer)' | grep "Generic (Other)" | sed 's/[[:blank:]]*//' | sed 's/ .*//' ]""
(file "./dev.exp" line 16)
我已经尝试过治疗前。 [和]作为特殊字符并与\一起使用,但它没有帮助。
答案 0 :(得分:2)
此行不起作用:
puts "[ exec echo '$expect_out(buffer)' | grep "Generic (Other)" | sed 's/[[:blank:]]*//' | sed 's/ .*//' ]"
这里的关键问题是'
不是Tcl 的特殊字符。相反,您需要使用{
... }
来做同样的想法(我也删除了外部的"
字符;它们没有帮助或阻碍除了写更长的东西之外出):
puts [exec echo {$expect_out(buffer)} | grep "Generic (Other)" | sed {s/[[:blank:]]*//} | sed {s/ .*//}]
但我认为这不是你想要的。我想你实际上会更好:
puts [exec grep "Generic (Other)" << $expect_out(buffer) | sed {s/[[:blank:]]*//;s/ .*//}]
事实上,使用这个更复杂的sed脚本来完成大部分工作会更好:
puts [exec sed -n {
/Generic \(Other\)/ {
s/[[:blank:]]*//
s/ .*//
p
}
} << $expect_out(buffer)]
或者您可以将代码放在纯Tcl中(显然这是一个非常直接的翻译):
foreach line [split $expect_out(buffer) "\n"] {
if {[string match "*Generic (Other)*" $line]} {
regsub {[[:blank:]]*} $line "" line
regsub { .*} $line "" line
puts $line
}
}