我想将文件中的一些行复制到Tcl中的另一个文件,其中正则表达式找到选择的起始行和结束行。 我试过这个:
while {[gets $thefile line] >= 0} {
if { [regexp {pattern1} $line] } {
while { [regexp {pattern2} $line] != 1 } {
puts $thefile2 $line
}
}
pattern1
和pattern2
并不总是在同一条线上。
这是一个无限循环,但如何继续写行直到达到第二个模式?
由于
答案 0 :(得分:2)
有两种方法。您可以嵌套循环(使用内部复制),也可以使用某种标记来切换单个循环的行为。
while {[gets $thefile line] >= 0} {
if {[regexp {pattern1} $line]} {
while {![regexp {pattern2} $line]} {
puts $thefile2 $line
# Note: might attempt a [gets] *twice* on EOF
if {[gets $thefile line] < 0} break
}
}
}
set flag off
while {[gets $thefile line] >= 0} {
if {!$flag && [regexp {pattern1} $line]} {
set flag on
} elseif {$flag && [regexp {pattern2} $line]} {
set flag off
}
# "off" and "on" are booleans
if {$flag} {
puts $thefile2 $line
}
}
您可以通过删除此时是否设置标志的测试来简化代码以切换模式;如果两个模式可以匹配相同的行,则只需要小心。