我正在尝试这样做:
- 我有一个文本文件,其中有一行以特定的模式开始:
vvdd vdd
- 我需要找到这行并插入另一行,样式为
vvss vss
- 原始线以下的所有其他线必须相应移位。
set filename "path265.spi"
set line_no 0
set count 0
set pattern "vvdd vdd"
set fp [open $filename r+]
while {[gets $fp line] != -1} {
incr count 1
if {[regexp $pattern $line]} {
set line_no $count
}
}
seek $fp 0
for {set i 0} {$i<$line_no} {incr i} {gets $fp replace}
puts $fp "nvvnw vnw 0 1.08"
puts $line_no
puts $count
close $fp
你可以使用::fileutil::updateInPlace
来简化事情。
package require fileutil
proc change {pattern newtext data} {
set res {}
foreach line [split $data n] {
lappend res $line
if {[regexp $pattern $line]} {
lappend res $newtext
}
}
return [join $res n]
}
::fileutil::updateInPlace path265.spi {change "^vvdd vdd" "vvss vss"}
updateInPlace
命令以文件名和命令前缀为参数。它将文件的内容添加到该命令前缀并调用它,然后将结果写回文件。
在本例中,调用的命令遍历文件的行,在匹配$pattern
的每一行之后添加$newtext
。这只是编写进行更改的过程的一种方法。如果只有第一个匹配是相关的,可以使用:
proc change {pattern newtext data} {
set lines [split $data n]
set index [lsearch -regexp $lines $pattern]
if {$index >= 0} {
set lines [linsert $lines $index+1 $newtext]
}
return [join $lines n]
}
等。
文档:fileutil package, foreach, if, lappend, linsert, lsearch, package, proc, regexp, return, set, split