在tcl中,如何替换文件中的一行?

时间:2010-05-12 11:03:31

标签: file replace tcl line

假设我打开了一个文件,然后将其解析为行。然后我使用循环:

foreach line $lines {}

在循环内部,对于某些行,我想用不同的行替换它们在文件中。可能吗?或者我是否必须写入另一个临时文件,然后在完成后替换文件?

例如,如果文件包含

AA
BB

然后我用小写字母替换大写字母,我希望原始文件包含

aa
bb

谢谢!

5 个答案:

答案 0 :(得分:8)

对于纯文本文件,最安全的做法是将原始文件移动到“备份”名称,然后使用原始文件名重写它:

更新:根据Donal的反馈进行编辑

set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]

set filename "filename.txt"
set temp     $filename.new.$timestamp
set backup   $filename.bak.$timestamp

set in  [open $filename r]
set out [open $temp     w]

# line-by-line, read the original file
while {[gets $in line] != -1} {
    #transform $line somehow
    set line [string tolower $line]

    # then write the transformed line
    puts $out $line
}

close $in
close $out

# move the new data to the proper filename
file link -hard $filename $backup
file rename -force $temp $filename 

答案 1 :(得分:5)

除了格伦的回答。如果您希望在整个内容的基础上对文件进行操作并且文件不是太大,那么您可以使用fileutil :: updateInPlace。这是一个代码示例:

package require fileutil

proc processContents {fileContents} {
    # Search: AA, replace: aa
    return [string map {AA aa} $fileContents]
}

fileutil::updateInPlace data.txt processContents

答案 2 :(得分:1)

如果这是Linux,那么执行“sed -i”会更容易,让它为你完成工作。

答案 3 :(得分:0)

如果是短文件,您只需将其存储在列表中:

set temp ""

#saves each line to an arg in a temp list
set file [open $loc]
foreach {i} [split [read $file] \n] {
    lappend temp $i
}
close $file

#rewrites your file
set file [open $loc w+]
foreach {i} $temp {
    #do something, for your example:
    puts $file [string tolower $i]
}
close $file

答案 4 :(得分:0)

set fileID [open "lineremove.txt" r] 
set temp [open "temp.txt" w+] 
while {[eof $fileID] != 1} { 
    gets $fileID lineInfo 
    regsub -all "delted information type here" $lineInfo "" lineInfo 
    puts $temp $lineInfo 
} 
file delete -force lineremove.txt 
file rename -force temp.txt lineremove.txt