tcl在文件中查找并替换
我需要帮助tcl。我有以下格式的文本文件:tcl在文件中查找并替换
Main = 1
Bgp = 0
Backup = 1
我需要通过1对每个项目递增的整数值,例如更换Main = 1
与Main = 2
,等等。
(更改我的回答:我是有点急躁了,不好意思。)
如果要处理的文本是在一个名为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
就是这样。
文档: append, close, fileutil (package), foreach, incr, open, package, proc, puts, read, return, seek, set, split, string
另一种方法:
# 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命令来计算新值
你尝试过什么?这是一个非常基本的程序,在完成一个简单的教程后,您应该可以做到这一点。 –