如何从Expect中的文本中提取数据

时间:2013-09-11 09:39:47

标签: bash sed tcl expect

我想在使用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)

我已经尝试过治疗前。 [和]作为特殊字符并与\一起使用,但它没有帮助。

1 个答案:

答案 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
    }
}