tcl在文件中查找和替换

时间:2017-08-14 10:36:11

标签: replace find tcl

我需要tcl的帮助。我有一个文本文件,格式如下:

Main = 1
Bgp = 0
Backup = 1

我需要为每个项目将整数值递增1,例如将Main = 1替换为Main = 2,依此类推。

2 个答案:

答案 0 :(得分:0)

(改变了我的回答:我有点烦躁,抱歉。)

如果要处理的文本位于名为data的变量中,可以将文本转换为单词列表,并按照以下方式逐个浏览:

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

在这种情况下,每个关键字( Main,Bgp,Backup,... )最终都在循环变量keyword内,每个等于符号(或者在第二个位置的任何东西) )在循环变量op内结束,每个要递增的值最终都在value内。

(分裂时,通常最好先剪掉文本开头和结尾处的空白区域:否则可能会出现空白"幽灵"元素。因此:{ {1}})

我们可以从文件" datafile"中读取数据。像这样:

split [string trim $data]

请注意,我们使用set f [open datafile r+] set data [read $f] 来读取和写入文件。

一旦我们处理了数据,我们就可以在文件的开头写回来,如下所示:

r+

或者可能是这样,这意味着我们不必使用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 可以简化此过程,可以为我们处理文件的打开,关闭,读取和写入。

首先,我们将处理放在一个程序中:

fileutil

然后我们可以请求proc process data { foreach {keyword = value} [split [string trim $data]] { append result "$keyword ${=} [incr value]\n" } return $result } 使用updateInPlace处理的新内容更新文件内容。

process

就是这样。

文档: appendclosefileutil (package)foreachincropenpackageprocputsreadreturnseeksetsplitstring

答案 1 :(得分:0)

另一种方法:

Main = 1

该regsub命令将Main = [expr {1 + 1}]替换为{{1}},然后subst命令实际调用expr命令来计算新值