我需要tcl的帮助。我有一个文本文件,格式如下:
Main = 1
Bgp = 0
Backup = 1
我需要为每个项目将整数值递增1,例如将Main = 1
替换为Main = 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
就是这样。
文档: append, close, fileutil (package), foreach, incr, open, package, proc, puts, read, return, seek, set, split, string
答案 1 :(得分:0)
另一种方法:
Main = 1
该regsub命令将Main = [expr {1 + 1}]
替换为{{1}},然后subst命令实际调用expr命令来计算新值