0

ファイルを 1 行ずつ読み取って、(別のファイルから) 文字列と ({ somedata }) のような文字セットで始まる一連の文字列を見つけ、## を含む行をそのブロックに追加できるようにする必要があります。

これが私がこれまでに持っているものです:

set mydir <path to my dir>
#file name file.txt with content:
~>cat file.txt
Strng00  {
   some data 
}

Strng021  {
   some data 
}

Strng02  {
   some data 
}

Strng03  {
   some data 
}

Strng_dt  {
   some data 
}

Strng01 {
   some data 
}
Strng02  {
   some data 
}

Strng03  {
   some data 
}

Strng_dt  {
   some data 
}

Strng42  {
   some data 
}

Strng412 
-- 
set list { Strng01 Strng02 Strng03 Strng_dt Strng42 } # May be read in the list from another file which needs to be matched
set fileIn [lindex $argv 0]
set fileInId  [open $mydir/file.txt r]
set appendLine 0
foreach item $list {
    set j 0
    while {[gets $fileInId line ] != -1} {
        if [regexp  -all -line $item $line] { set appendLine 1 } 
        if $appendLine {
            if [regexp {^\s*\}\s*$} $line] { set appendLine 0 }   
            set line "## $line"    
        }
        puts $line
    }
set j 1
}

結果には、リストの最初のエントリのみが表示されます。

Strng00 
Strng021 
Strng02 
Strng03 
Strng_dt 
##Strng01  {
##   some data  
##}

Strng02 
Strng03 
Strng_dt 
Strng42 

Strng412

リストされた各項目の後に ## を付けたい.. よろしくお願いします.`

4

2 に答える 2

0

これで問題は解決しますか?

set list { Strng01 Strng02 Strng03 Strng_dt Strng42 }
set fileInId  [open $mydir/file.txt r]

while {[gets $fileInId line ] != -1} {
    if {[regexp -line [join $list |] $line]} {
        set line "## $line"    
    }
    puts $line
}

編集:更新された仕様を扱います。

これは 1 つの方法です。ファイル内の行が Tcl コマンド呼び出し構文と一致するという事実を利用しています。

proc unknown {cmd args} {
    set list { Strng01 Strng02 Strng03 Strng_dt Strng42 }
    if {$cmd in $list} {
        foreach line [split [info level 0] \n] {
            puts "## $line"
        }
    } else {
        puts [info level 0]
    }
}

source file.txt

次のように動作します:sourceファイルで使用するということは、Tcl インタープリターが各行のキーワードをコマンド名として使用し、その{ ... }部分を引数として使用しようとすることを意味します。キーワードは既存のコマンドではないため、インタープリターは呼び出しをコマンドに渡します。コマンドは、関連するキーワードを認識し、リストにある場合unknownは完全な呼び出し ( [info level 0]) をプレフィックス付きで出力するように再定義されています。##召喚はそのまま。

ドキュメント: chanforeachifinfojoinopenprocputsregexpsetsourcesplitunknownwhile

于 2016-02-12T07:34:31.593 に答える