0

TCL スクリプティング: 文字列を検索する方法を知っているファイルがありますが、文字列が見つかったときに行番号を取得する方法を知っています。可能であれば回答してください

また

set fd [open test.txt r]
while {![eof $fd]} {
    set buffer [read $fd]
}

set lines [split $buffer "\n"]
if {[regexp "S1 Application Protocol" $lines]} {
    puts "string found"
} else {puts "not found"}
#puts $lines

#set i 0
#while {[regexp -start 0 "S1 Application Protocol" $line``s]==0}  {incr i
#puts $i
#}

#puts  [llength $lines]
#puts [lsearch -exact $buffer  S1]
#puts [lrange $lines 261 320]

上記のプログラムでは、見つかった文字列として出力を取得しています。このファイル以外の文字列を指定すると、文字列が見つかりません。

4

2 に答える 2

0

最も簡単な方法は、次のfileutil::grepコマンドを使用することです。

package require fileutil

# Search for ipsum from test.txt
foreach match [fileutil::grep "ipsum" test.txt] {
    # Each match is file:line:text
    set match      [split $match ":"]
    set lineNumber [lindex $match 1]
    set lineText   [lindex $match 2]

    # do something with lineNumber and lineText
    puts "$lineNumber - $lineText"
}

アップデート

lineText行にコロンが含まれている場合、3 番目のコロンで切り捨てられることに気付きました。したがって、代わりに:

    set lineText   [lindex $match 2]

必要なもの:

    set lineText   [join [lrange $match 2 end] ":"]
于 2013-03-09T02:52:05.457 に答える
0

「行」の概念は、ファイルから取得するデータ ストリームの上に重ねる規則にすぎません。したがって、行番号を使用する場合は、自分で計算する必要があります。getsコマンド ドキュメントには、次の例が含まれています。

set chan [open "some.file.txt"]
set lineNumber 0
while {[gets $chan line] >= 0} {
    puts "[incr lineNumber]: $line"
}
close $chan

そのため、検索したいテキストのパターンを見つけるために puts ステートメントをコードに置き換えるだけでよく、それが見つかったときに の値から$line行番号が得られます。

他の 2 行の間にあるテキストをコピーするには、次のようなものを使用します

set chan [open "some.file.txt"]
set out [open "output.file.txt" "w"]
set lineNumber 0
# Read until we find the start pattern
while {[gets $chan line] >= 0} {
    incr lineNumber
    if { [string match "startpattern" $line]} {
        # Now read until we find the stop pattern
        while {[gets $chan line] >= 0} {
            incr lineNumber
            if { [string match "stoppattern" $line] } {
                close $out
                break
            } else {
                puts $out $line
            }
        }
    }
}
close $chan
于 2013-03-08T12:05:37.260 に答える