Expect 脚本:从 $argv 构建正则表达式字符串

Expect scripting: Constructing a regular expression string from $argv

我正在编写一个 expect 脚本来搜索以下格式的字符串:

([0-9]*)\) sign-([0-9]*)-X16-2019-11-04-dash.tar.xyz.abc

例如:

106) sign-496-X16-2019-11-04-dash.tar.xyz.abc

在 TUI 中并获取“)”之前的部分[通过 $expect_out(1,string) 变量]并将其发送到 TUI。

但是日期部分是可变的 [2019-11-04] & expect 脚本通过 $argv 获取它作为输入。 我一直在尝试找出正确的转义模式以正确连接字符串,以便正则表达式起作用。到目前为止我已经尝试过:

set inputStr [lindex $argv 0] 
expect -re {([0-9]*)\) sign-([0-9]*)-X16-\"$inputStr\"-dash.tar.xyz.abc} {....}

set inputStr [lindex $argv 0] 
expect -re {([0-9]*)\) sign-([0-9]*)-X16-{$inputStr}-dash.tar.xyz.abc} {....}

但这些与 TUI 中的任何字符串都不匹配。我做错了什么?

问题是您将 RE 括在大括号中,这会抑制所有替换。将 RE 括在大括号中通常是一件好事,因为它们通常包含反斜杠和方括号等,但这对您来说是个问题。修复它的最简单方法是使用 string map:

添加您自己的替换
set inputStr [lindex $argv 0] 
set RE {([0-9]*)\) sign-([0-9]*)-X16-\"%inputStr%\"-dash.tar.xyz.abc}
expect -re [string map [list "%inputStr% $inputStr] $RE] {....}