1

我想在使用 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)之后获取提取的数字,然后用它作为Your selection发送,所以我的首选输出只是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)

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

4

1 回答 1

2

此行将不起作用:

puts "[ exec echo '$expect_out(buffer)' | grep "Generic (Other)" | sed 's/[[:blank:]]*//' | sed 's/ .*//' ]"

这里的关键问题是它根本'不是 Tcl 的特殊字符。相反,您需要使用...<code>} 来执行相同的想法(我还删除了外部字符;它们除了使写出更长的时间之外没有帮助或阻碍):{"

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
    }
}
于 2013-09-11T12:43:56.427 回答