使用tcl在文件的特定位置追加行



我正在尝试这样做:

  1. 我有一个文本文件,其中有一行以特定的模式开始:vvdd vdd
  2. 我需要找到这行并插入另一行,样式为vvss vss
  3. 原始线以下的所有其他线必须相应移位。
下面是我到目前为止插入到错误位置的代码:
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

最新更新