如何在Tcl中将选择的行从文件复制到文件?

时间:2012-07-05 09:42:37

标签: parsing tcl

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

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

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

由于

1 个答案:

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

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