使用 TCL 识别列表中的大括号和多个实例

Identify curly bracket and multiple instances in list using TCL

我正在读取一个大文件,但我只对文件的一小部分感兴趣,如下所示。

TC.0.Type = Bob 1
TC.1.Type = Mark 1
TC.2.Type =
TC.3.Type =
TC.4.Type = Fred 1
TC.5.Type =
TC.6.Type =
TC.7.Type = 
TC.8.Type =
TC.9.Type = Fred 1

我创建了一个现在保存此信息的变量

data = "{Bob 1} {Mark 1} {} {} {Fred 1} {} {} {} {} {Fred 1}"

TC 总是在 0-9 之间,所以长度是已知的。

我想做的是:

1) 如果"Fred 1"有多个实例则删除。 2)找到第一个空槽并确定索引。

问题 1) 使用 lappend 时通常会得到括号吗?我预计这只会出现在空字段的情况下

set data ""
for {set j 0} {$j < 10} {incr j} {  
    lappend data $fromfile
    }
puts "Data in list = $data"

问题2)我什至尝试过使用正则表达式来找出空的,但似乎没有成功。

查找空白字段{}

set j 0
for {set i 0} {$i < $ldata} {incr i} {
# set nline [split $data "\s"]
# puts "data ($i) = $nline"
if {[regexp {\{.*\}} $data]} {
   puts " Found {}"
   incr j
   puts "j = $j"
}
}

查找具有名称的字段,例如鲍勃 1

for {set i 0} {$i < $ldata} {incr i} {
if {[regexp {\{.*[a-zA-Z0-9]\}} $data]} {
   puts " Found something with names"
}
}

如果有人能提供建议和指导,我们将不胜感激。

lsearch 命令将对您正在做的事情非常有用,尤其是 使用 -all 选项。

set data "{Bob 1} {Mark 1} {} {} {Fred 1} {} {} {} {} {Fred 1}"
puts [lsearch -all -exact $data "Fred 1"]
# ==> 4 9

我们也可以用它来删除特定值:

puts [lsearch -all -inline -exact -not $data "Fred 1"]
# ==> {Bob 1} {Mark 1} {} {} {} {} {} {}

要找到第一个空位,我们只需这样做:

puts [lsearch -exact $data ""]
# ==> 2

我们绝对希望列表操作返回大括号;这就是空列表元素的表达方式。