1

我想将一个文件中的选定行复制到 Tcl 中的另一个文件中,其中正则表达式查找选择的开始行和结束行。我试过这个:

    while {[gets $thefile line] >= 0} {
       if { [regexp {pattern1} $line] } {
            while { [regexp {pattern2} $line] != 1 } {
                    puts $thefile2 $line
                    }
    }

pattern1并不pattern2总是在同一行。这是一个无限循环,但是如何继续写行直到达到第二个模式?

谢谢

4

1 回答 1

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
    }
}

您可以通过删除在该点是否设置标志的测试来简化切换模式的代码;如果两种模式都可以匹配同一行,则只需要小心。

于 2012-07-05T10:07:12.270 回答