2017-08-14 6 views
-1

J'ai besoin d'aide avec tcl. J'ai un fichier texte avec le format suivant:tcl trouver et remplacer dans le fichier

Main = 1 
Bgp = 0 
Backup = 1 

je dois augmenter la valeur entière de 1 pour chaque élément, par exemple le remplacement Main = 1 avec Main = 2, et ainsi de suite.

+0

Qu'avez-vous essayé? C'est un programme assez basique que vous devriez être capable de faire après avoir travaillé sur un simple tutoriel. –

Répondre

0

(a changé ma réponse: j'étais un peu irritable, désolé.)

Si le texte à traiter est une variable appelée data, on peut transformer le texte en une liste de mots et de passer par les trois à un moment comme celui-ci:

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

dans ce cas, chaque mot-clé (principal, Bgp, sauvegarde, ...) se termine à l'intérieur de la variable de boucle keyword, chaque signe égal (ou tout ce qui est dans la deuxième position) finit dans la variable de boucle op, et chaque valeur doit être dans crémenté se termine à l'intérieur value.

(Lorsque le fractionnement, il est généralement une bonne idée de couper l'espace blanc au début et à la fin du texte premier: sinon on peut obtenir des éléments « fantômes » vides où:. split [string trim $data])

Nous pouvons lire les données du fichier « datafile » comme ceci:

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

Notez que nous utilisons r+ pour pouvoir à la fois lire et écrire dans le fichier.

Une fois que nous avons traité les données, nous pouvons écrire de nouveau au début du fichier comme ceci:

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

ou peut-être comme celui-ci, ce qui signifie que nous ne devions pas ouvrir le fichier avec r+ :

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

Constituer:

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 

Cette procedu re peut également être simplifié un peu en utilisant le paquet standard fileutil, qui peut s'occuper de l'ouverture, de la fermeture, de la lecture et de l'écriture des fichiers pour nous.

D'abord, nous avons mis le traitement dans une procédure:

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

nous pouvons alors demandez demander updateInPlace de mettre à jour le contenu du fichier avec de nouveaux contenus traités par process.

package require fileutil 

::fileutil::updateInPlace datafile process 

Et c'est tout.

Documentation: append, close, fileutil (package), foreach, incr, open, package, proc, puts, read, return, seek, set, split, string

0

Une autre approche:

# 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 

Cette regsub commande remplacera Main = 1 avec Main = [expr {1 + 1}], puis la commande subst invoque en fait la commande expr pour calculer la nouvelle valeur