2017-08-14 163 views
-1

我需要帮助tcl。我有以下格式的文本文件:tcl在文件中查找并替换

Main = 1 
Bgp = 0 
Backup = 1 

我需要通过1对每个项目递增的整数值,例如更换Main = 1Main = 2,等等。

+0

你尝试过什么?这是一个非常基本的程序,在完成一个简单的教程后,您应该可以做到这一点。 –

回答

0

(更改我的回答:我是有点急躁了,不好意思。)

如果要处理的文本是在一个名为data变量,一个可以把文本转换成一个单词列表,并经过他们三年在这样的时刻:

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

在这种情况下,每个关键字(主,BGP,备份,...)循环变量keyword内结束,每个等号(或无论是在第二位置)在循环变量op内部结束,并且每个值都在在value内部结实。

(当分裂,它通常在文本的开始和结束第一修剪过的白色空间是一个好主意:否则一个可以得到空“鬼”的元素。因此: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 

这procedu re也可以使用标准包fileutil简化一点,它可以为我们打理,关闭,阅读和写作文件。

首先,我们把处理过程:

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

然后我们就可以问问updateInPlace更新与process处理新内容的文件的内容。

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命令实际上调​​用expr命令来计算新值