как в tcl заменить строку в файле?



Предположим, я открыл файл, а затем разбил его на строки. Затем я использую цикл:



foreach line $lines {}


Внутри цикла для некоторых строк я хочу заменить их внутри файла другими строками. Возможно ли это? Или мне нужно написать в другой временный файл, а затем заменить файлы, когда я закончу?



Например, если файл содержал



AA
BB


И затем я заменяю заглавные буквы строчными буквами, Я хочу, чтобы исходный файл содержал



aa
bb


Спасибо!

646   5  

5 ответов:

Для обычных текстовых файлов безопаснее всего переместить исходный файл в" резервную копию", а затем переписать его, используя исходное имя файла:

Обновление: отредактировано на основе обратной связи Донала

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 

В дополнение к ответу Гленна. Если вы хотите работать с файлом на основе всего содержимого и файл не слишком велик, то вы можете использовать fileutil::updateInPlace. Вот пример кода:

package require fileutil

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

fileutil::updateInPlace data.txt processContents

Если это Linux, было бы проще выполнить "sed-i" и позволить ему делать работу за вас.

Если это короткий файл, вы можете просто сохранить его в списке:

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
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 

Comments

    Ничего не найдено.