我试过lsearch -all $list_ 0,a1[4],*
a1[4]存储在一个变量中所以基本上需要set var "a1[4]"
lsearch -all $list_ 0,$var,*
默认情况下,lsearch
使用glob模式(正如string match
的文档所描述的那样-它是使用的完全相同的匹配引擎)。这很好,因为它意味着*
是一个通配符,但是很尴尬,因为它意味着[
也是特殊的(它开始一个字符集匹配)。你需要一些简单的转义,为了保持的正常,你应该把你的整个模式放在{
大括号}
中,这样我们就不需要和Tcl争论大括号和反斜杠的含义了:
lsearch -all $list_ {0,a1[4],*}
你不需要大括号;你可以这样写:
lsearch -all $list_ 0,a1\[4\],*
但那是丑!而且很难维护(相信我)。所以用大括号,好吗?
在从变量中提取子模式的情况下,事情变得更加复杂。解决方法是使用string map
(或regsub
)来调整模式片。
# Split into three lines for clarity; qvar = “quoted var”
set ADD_BACKSLASHES {[ {[} ] {]}}
set qvar [string map $ADD_BACKSLASHES $var]
lsearch -all $list_ 0,$qvar,*