in tcl, how do I replace a line in a file?

前端 未结 5 1321
执念已碎
执念已碎 2021-01-01 03:55

let\'s say I opened a file, then parsed it into lines. Then I use a loop:

foreach line $lines {}

inside the loop, for some lines, I want to

相关标签:
5条回答
  • 2021-01-01 04:41
    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 
    
    0 讨论(0)
  • 2021-01-01 04:48

    If it's a short file you can just store it in a list:

    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
    
    0 讨论(0)
  • 2021-01-01 04:49

    In addition to Glenn's answer. If you would like to operate on the file on a whole contents basis and the file is not too large, then you can use fileutil::updateInPlace. Here is a code sample:

    package require fileutil
    
    proc processContents {fileContents} {
        # Search: AA, replace: aa
        return [string map {AA aa} $fileContents]
    }
    
    fileutil::updateInPlace data.txt processContents
    
    0 讨论(0)
  • 2021-01-01 04:50

    for plain text files, it's safest to move the original file to a "backup" name then rewrite it using the original filename:

    Update: edited based on Donal's feedback

    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 
    
    0 讨论(0)
  • 2021-01-01 04:53

    If this is Linux it'd be easier to exec "sed -i" and let it do the work for you.

    0 讨论(0)
提交回复
热议问题