Regex Expect-如何在一个interact循环中执行多个正则表达式匹配?
我试图在一个交互会话期间在同一屏幕输出上执行多个正则表达式匹配。通过以下代码,我得到了错误消息:“不能多次使用-o” 最后,我想使用几个正则表达式从每个输出屏幕中提取几个小数据变量,如中所述。我想做的可能吗?如果可能,正确的语法是什么Regex Expect-如何在一个interact循环中执行多个正则表达式匹配?,regex,linux,scripting,tcl,expect,Regex,Linux,Scripting,Tcl,Expect,我试图在一个交互会话期间在同一屏幕输出上执行多个正则表达式匹配。通过以下代码,我得到了错误消息:“不能多次使用-o” 最后,我想使用几个正则表达式从每个输出屏幕中提取几个小数据变量,如中所述。我想做的可能吗?如果可能,正确的语法是什么 interact { #... #... actions during interact loop to perform with variables extracted #... #variable extraction
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"
}
}
从
manexpect
,关于交互的部分:
-o
标志导致将以下任何键体对应用于当前进程的输出。例如,在处理在telnet会话期间发送不需要的字符的主机时,这可能很有用。[我的重点]
因此,-o
似乎改变了从出现到交互
块结束的行为。因此,它只能出现一次是有道理的
现在,解决方案显而易见:将所有输出表达式放在交互
的末尾,并在第一个表达式之前添加-o
。来自人类期望
,关于交互
的部分:
-o
标志导致将以下任何键体对应用于当前进程的输出。例如,在处理在telnet会话期间发送不需要的字符的主机时,这可能很有用。[我的重点]
因此,-o
似乎改变了从出现到交互
块结束的行为。因此,它只能出现一次是有道理的
解决方案现在很明显:将所有的输出表达式放在interact
的末尾,并在第一个表达式之前添加-o
。这是否意味着我可以使用嵌套的regex将-o{-re{regex here}-re{regex here}(键体对)与regex嵌套在一起?我只是尝试了一下,但它没有运行-re{}部分。如果我没有将-re{}部分嵌套在-o{}中,而是将它们放在后面,那么我的会话将失败,并显示以下错误消息:“无法编译正则表达式模式:无效重复计数”@jclarkson-您不应该在-o选项中添加大括号,因为从语法上讲,这只是交互
的另一个选项(如果这样做,那么大括号内的所有文本都将是一个需要匹配的大字符串!)。不相关的“无效重复计数”错误是因为“{0-6}”确实是无效的重复计数。它可能应该是“{0,6}”。很好,这很好地解释了这一点。这是否意味着我可以有一个-o{-re{{regex here}-re{{regex here}(键体对)与regex嵌套?我只是尝试了一下,但它没有运行-re{}部分。如果我没有将-re{}部分嵌套在-o{}中,而是将它们放在后面,那么我的会话将失败,并显示以下错误消息:“无法编译正则表达式模式:无效重复计数”@jclarkson-您不应该在-o选项中添加大括号,因为从语法上讲,这只是交互
的另一个选项(如果这样做,那么大括号内的所有文本都将是一个需要匹配的大字符串!)。不相关的“无效重复计数”错误是因为“{0-6}”确实是无效的重复计数。它应该是“{0,6}”。这很好地解释了这一点。