尝试使用正则表达式了解现有TCL脚本的一部分

时间:2012-12-14 16:06:02

标签: regex tcl

我一直在研究这个问题,因为我正在尝试使用TCL与我店里的路由器合作。我们有一个技术人员正在编写我可以访问的脚本,所以我试图从他的工作中学习。

我在脚本的开头遇到了以下部分,我一直在努力理解这些部分并且几乎没有取得进展。我希望你可以提供任何解释。

该部分设置提示,并创建稍后在脚本中使用的提示设置。

set prompt "(%|#|\\$) $"      ;# default prompt
catch {set prompt $env(EXPECT_PROMPT)}
set spec "(,|%|\\)|\\(|;|:|\\.|\\*|\[|\]| |/|{|}|\\||\\$|\"|\'|\\\\|-)"

稍后,变量spec的值使用如下:

set cmd "show clock"
regsub -all $spec $cmd "_" cmde

所以我真的很想知道发生了什么,但我的'网络foo'让我彻底失败了。

谢谢!     马克

1 个答案:

答案 0 :(得分:2)

regsub命令将一组“特殊”字符转换为下划线。 spec正则表达式可能更容易理解(并且更容易阅读),如下所示:

set spec {[][,%)(;:.* /{}|$"'\\-]}

括号,逗号,百分比,括号,分号,冒号,点,星号,空格,斜线,大括号,管道,美元,双引号,单引号,反斜杠,连字符 - (如果您要将括号放在字符类中,您必须将右括号放在第一个字符上

外推一点,如果目标是将所有非字母数字字符更改为下划线,请按照这样做

regsub -all {\W} $cmd "_" cmde

\W是“非单词字符”

的正则表达式简写

http://tcl.tk/man/tcl8.5/TclCmd/re_syntax.htm

设置提示变量的另一种方法,以及我将如何编写它:

if {[info exists env(EXPECT_PROMPT)]} {
    set prompt $env(EXPECT_PROMPT)
} else {
    set prompt {[%#$] $}
}

如果您正在学习Tcl,请使用Tcl Tutorial