这个 TCL 应该解析文件直到找到模式。然后会有数量可变的某种序言行,它们具有不同的独特模式,我想跳过这些行,然后对接下来的行做有趣的事情。因此,一旦模式匹配,我就需要去掉序言行。我知道这些线条的模式,但不知道有多少。可能为零到 N。
寻找在 while 获取条件内是否可以进行模式检查的方法。
类似于(伪 TCL 代码):
set fp [ open $fname ]
while { [gets $fp line] >= 0 } {
if {[regexp $pat $line]} {
while { [gets $fp line] == some preamble } { skip }
Now do something with $line
...
}
}
close $fp
while 可以分成多行。但有没有一种单行解决方案?
我不知道有任何专门用于此目的的东西。问题是你需要一个小状态机来判断行何时“有趣”,而这类事情往往是非常特定于格式的。
不过,您可以编写一个辅助程序。
proc forEachInterestingLine {lineVar channel body} {
upvar 1 $lineVar var
set interesting 0
while {[gets $channel var] >= 0} {
if {!$interesting} {
set interesting [regexp START_INTERESTING $var]
}
if {$interesting} {
uplevel 1 $body
set interesting [expr {![regexp END_INTERESTING $var]}]
}
}
}
set ch [open thefile.txt]
forEachInterestingLine line $ch {
# do something here
puts $line
}
close $ch
您需要定义什么标记有趣部分的开始和结束(如果您想从有趣性中排除开始和结束标记,测试的顺序会有点不同)。