2017-08-14 14 views
-1

私はtclに関する助けが必要です。ようにMain = 2Main = 1との交換、例えば、私は、各項目に対して1により整数値をインクリメントする必要tclファイル内で見つけて置き換えます

Main = 1 
Bgp = 0 
Backup = 1 

:私は、次の形式のテキストファイルを有します。

+0

新しい値を計算する式exprコマンドを呼び出し、あなたは何を試してみましたか?これは簡単なチュートリアルを通して作業しなければならないかなり基本的なプログラムです。 –

答えて

0

(私の答えを変更しました:私は申し訳ありませんが、少しイライラした)

処理されるべきテキストがdataという変数である場合は、1単語のリストにテキストをオンにし、それら3を通過することができますこのような時に:この場合

set result "" 
foreach {keyword op value} [split [string trim $data]] { 
    append result "$keyword $op [incr value]\n" 
} 

、各キーワード(メイン、BGP、バックアップ、...)はループ変数keyword内しまい、それぞれが等号(または第二には何でも位置)はループ変数opの中で終わり、各値は完成したものがvalueの内部に終わります。

(分割するとき、それは最初のテキストの最初と最後に空白をトリミングするために一般的に良い考えです:それ以外の場合は1が空に「ゴースト」の要素を取得することができますしたがって:split [string trim $data])を

我々は読むことができます私たちからの読み取りとファイルへの書き込みの両方できるようにr+を使用

set f [open datafile r+] 
set data [read $f] 

注:このようなファイルからデータ「のデータ・ファイル」。

我々はデータを処理した後、我々はこのようなファイルの先頭にそれを書き戻すことができます。

seek $f 0 
puts -nonewline $f $result 
close $f 

またはおそらくこのような、我々はr+でファイルを開く必要はありませんでした意味:

close $f 
set f [open datafile w] 
puts -nonewline $f $result 
close $f 

は一緒にそれを置く:

set f [open datafile r+] 
set data [read $f] 
set result "" 
foreach {keyword op value} [split [string trim $data]] { 
    append result "$keyword $op [incr value]\n" 
} 
seek $f 0 
puts -nonewline $f $result 
close $f 

これ。手順reは、標準パッケージfileutilを使用して少し簡素化することもできます。このパッケージは、私たちのファイルのオープン、クローズ、読み取り、書き込みの処理を行うことができます。

まず、我々は手順で処理を置く:

proc process data { 
    foreach {keyword = value} [split [string trim $data]] { 
     append result "$keyword ${=} [incr value]\n" 
    } 
    return $result 
} 

その後、我々はちょうどprocessによって処理された新しい内容でファイルの内容を更新するupdateInPlaceを頼む頼むことができます。

package require fileutil 

::fileutil::updateInPlace datafile process 

これだけです。

ドキュメント: appendclosefileutil (package)foreachincropenpackageprocputsreadreturnseeksetsplitstring

0

別のアプローチ:

# read the data 
set f [open file] 
set data [read -nonewline $f] 
close $f 

# increment the numbers 
regsub -all {=\s*(\d+)\s*$} $data {= [expr {\1 + 1}]} new 
set new [subst -novariables -nobacklashes $new] 

# write the data 
set f [open file w] 
puts $f $new 
close $f 

コマンドをregsub Main = [expr {1 + 1}]Main = 1を交換し、その後substコマンドは、実際に

関連する問題