【问题标题】:Expect - How can I perform multiple regular expression matches in one interact loop?Expect - 如何在一个交互循环中执行多个正则表达式匹配?
【发布时间】:2012-03-01 10:22:16
【问题描述】:

我正在尝试在一个交互会话期间在同一屏幕输出上执行多个正则表达式匹配。使用以下代码,我收到错误消息:"cannot use -o more than once"

最终,我想使用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"
        } 
}

【问题讨论】:

    标签: regex linux scripting tcl expect


    【解决方案1】:

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

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

    所以看起来-o 改变了从它出现的位置到interact 块结束的行为。因此,它只能出现一次是有道理的。

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

    【讨论】:

    • 这是否意味着我可以有一个 -o { -re { #regex here } -re { #regex here } } (key-body pair)与 regex 嵌套?我刚刚尝试过,但无法运行 -re {} 部分。
    • 如果我不使用 -o {} 嵌套 -re {} 部分,而是将它们放在后面,我的会话将失败并显示以下错误消息:“无法编译正则表达式模式:无效重复计数“
    • @jjclarkson - 您应该在 -o 选项中添加大括号,因为在语法上只是 interact 的另一个选项(如果您这样做,那么大括号将是一个要匹配的大字符串!)。不相关的“无效重复计数”错误是因为“{0-6}”确实是无效重复计数。应该是“{0,6}”。
    • 太好了,这解释得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多