期望 - 如何在一个交互循环中执行多个正则表达式匹配?

时间:2012-02-08 22:31:10

标签: regex linux scripting tcl expect

我正在尝试在一个交互会话期间在同一屏幕输出上执行多个正则表达式匹配。使用以下代码我收到错误消息:“不能使用-o多次”

最终,我想使用this question中详述的几个正则表达式从每个输出屏幕中提取几个小数据变量。我正在尝试做什么,如果是这样,那么正确的语法是什么?

interact {
    #...
    #... actions during interact loop to perform with variables extracted
    #...

        #variable extraction from output ------------------------------------
        -o -nobuffer -re {(\[1;14H[a-zA-Z0-9]{1})[0-9]{5}} {
                #get po number
                set poraw $interact_out(0,string)
                #get just po out
                set po [string range $poraw 6 11] 
                #switch to lowercase
                set po [string tolower $po]
                #send_user "  stored po: $po"
        }   

        #get cost from po detail
        #ex. 001b[14;27H    20.1900
        -o -nobuffer -re {(\[14\;27H)[0-9]{0-6}\.{1}[0-9]{4}} {
                set pocost $interact_out(0,string)
                send_user "  stored po cost: $pocost"
        } 
}

修改 所以有效的代码看起来像这样:

interact {
    #...

    -o
        -nobuffer -re {(\[1;14H[a-zA-Z0-9]{1})[0-9]{5}} {
                #get po number
                set poraw $interact_out(0,string)
                #get just po out
                set po [string range $poraw 6 11] 
                #switch to lowercase
                set po [string tolower $po]
        }   

        #get cost from po detail
        #ex. 001b[14;27H    20.1900
        -nobuffer -re {(\[14\;27H) *[0-9]{0,6}\.{1}[0-9]{4}} {
                set pocostraw $interact_out(0,string)
                set pocosttrim [string range $pocostraw 7 17]
                set pocost [string trimleft $pocosttrim ]
                send_user "  stored po cost: $pocost"
        } 
}

1 个答案:

答案 0 :(得分:4)

来自man expect,关于interact的部分:

  

-o标记会将任何后续键体对应用于当前进程的输出。例如,在处理在telnet会话期间发送不需要的字符的主机时,这可能很有用。 [强调我的]

所以似乎-o将行为从它出现的位置更改为interact块的结尾。因此,它只能出现一次才有意义。

解决方案现在显而易见:将所有输出表达式放在interact的末尾,并在第一个之前添加-o