Ожидайте - Как я могу выполнить несколько совпадений регулярных выражений в одном цикле взаимодействия? - PullRequest
2 голосов
/ 09 февраля 2012

Я пытаюсь выполнить несколько совпадений регулярных выражений на одном и том же выводе экрана во время одного сеанса взаимодействия.С помощью следующего кода я получаю сообщение об ошибке: "не могу использовать -o более одного раза"

В конечном итоге я хочу извлечь несколько небольших переменных данных из каждого экрана вывода, используя несколькорегулярные выражения, как описано в этот вопрос .Возможно ли то, что я пытаюсь сделать, если да, какой правильный синтаксис?

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 Ответ

4 голосов
/ 09 февраля 2012

С man expect, раздел о interact:

Флаг -o заставляет любые последующие пары клавиш и тела применяться к выходным данным текущего процесса. Это может быть полезно, например, при работе с хостами, которые отправляют нежелательные символы во время сеанса telnet. [Акцент мой]

Так что, похоже, -o меняет поведение с того места, где оно появляется, до конца блока interact. Таким образом, имеет смысл, что он может появиться только один раз.

Решение теперь очевидно: соедините все выражения output вместе в конце interact и добавьте -o непосредственно перед первым.

...