1

選択した行をTclのファイルから別のファイルにコピーしたいのですが、正規表現は選択の開始行と終了行を検索します。私はこれを試しました:

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

pattern1pattern2は常に同じ行にあるとは限りません。これは無限ループですが、2番目のパターンに到達するまで行を書き続けるにはどうすればよいですか?

ありがとう

4

1 に答える 1

2

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 に答える