匹配模式并将值添加到 Tcl 中的列表

Matching pattern and adding values to a list in Tcl

我想知道是否可以得到一些建议,我正在尝试通过读取具有如下所示输入的文件来创建列表

来自输入文件的示例

Parameter.Coil = 1
Parameter.Coil.Info = Coil
BaseUTC.TimeSet_v0 = 1
BaseUTC.TimeSet_v0.Info = TimeSet_v0
BaseUTC.TimeSet_v1 = 1
BaseUTC.TimeSet_v1.Info = TimeSet_v1
BaseUTC.TimeSet_v14 = 1
BaseUTC.TimeSet_v14.Info = TimeSet_v14
BaseUTC.TimeSet_v32 = 1
BaseUTC.TimeSet_v32.Info = TimeSet_v32
VC.MILES = 1
VC.MILES.Info = MILES_version1

我对任何前缀为“BaseUTC”的行感兴趣。和“.Info”,并希望在列表中的“=”之后保存值

期望:

output = TimeSet_v0 TimeSet_v1 TimeSet_v14 TimeSet_v32

我尝试了以下但没有得到想要的输出。

set input [open "[pwd]/Data/Input" r]

set list ""
while { [gets $input line] >= 0 } {
   incr number
   set sline [split $line "\n"]
   if {[regexp -- {BaseUTC.} $sline]} {
      #puts "lines = $sline"
      if {[regexp -- {.Info} $sline]} {
         set output [lindex [split $sline "="] 1]
         lappend list $output
}}}
puts "output = $list"
close $input

我的输出为

output = \ TimeSet_v0\} \ TimeSet_v1\} \ TimeSet_v14\} \ TimeSet_v32\} 

请大家帮忙指出我的错误。

提前谢谢你。

你的很多代码似乎与你的描述不符(转向?我以为你在寻找 BaseUTC 行?),或者只是没有意义(为什么要拆分你已经知道的是换行符的单行字符?),但真正有助于简化事情的一件事是正则表达式捕获组。类似于:

#!/usr/bin/env tclsh

proc process {filename} {
    set in [open $filename]
    set list {}
    while {[gets $in line] >= 0} {
        if {[regexp {^BaseUTC\..*\.Info\s+=\s+(.*)} $line -> arg]} {
            lappend list $arg
        }
    }
    close $in
    return $list
}

puts [process Data/Input]

或者使用通配符代替正则表达式:

proc process {filename} {
    set in [open $filename]
    set list {}
    while {[gets $in line] >= 0} {
        lassign [split $line =] var arg
        if {[string match {BaseUTC.*.Info} [string trim $var]]} {
            lappend list [string trim $arg]
        }
    }
    close $in
    return $list
}