как в tcl заменить строку в файле?
Предположим, я открыл файл, а затем разбил его на строки. Затем я использую цикл:
foreach line $lines {}
Внутри цикла для некоторых строк я хочу заменить их внутри файла другими строками. Возможно ли это? Или мне нужно написать в другой временный файл, а затем заменить файлы, когда я закончу?
Например, если файл содержал
AA
BB
И затем я заменяю заглавные буквы строчными буквами, Я хочу, чтобы исходный файл содержал
aa
bb
Спасибо!
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
Если это короткий файл, вы можете просто сохранить его в списке:
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