繁体   English   中英

使用tcl将行附加到文件中的特定位置

[英]appending line to a file in a specific location using 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软件包, foreachiflappendlinsertlsearchpackageprocregexpreturnsetsplit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM