如何搜索0,a1[4],*,其中*是0,a2,4 0,a1[4], 30 0,a1[4],5 ..的列表中的通配符在tc



我试过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,*

最新更新