【问题标题】:Expect scripting: Constructing a regular expression string from $argv期望脚本:从 $argv 构造正则表达式字符串
【发布时间】:2019-11-06 19:30:20
【问题描述】:

我正在编写一个期望的脚本,它以以下格式搜索字符串:

([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] 并且期望脚本通过 $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 中的任何字符串都不匹配。我做错了什么?

【问题讨论】:

    标签: regex escaping tcl expect tui


    【解决方案1】:

    问题是您将 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] {....}
    

    【讨论】:

    • 还有 许多 其他方法可以进行此类替换。 format 命令是一个不错的选择,特别是如果您知道 C 的 sprintf() 使用类似的格式方案。
    猜你喜欢
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多