2016-12-05 90 views
0

我想通過內存和我的情況如下替換文件中的一行;替換和範圍替換輸出

  1. 第一種情況;爲什麼在每次運行下腳本仍然在最後一個列表字符串之後添加空行?沒有記憶的任何選項?

    set lines [split [read $fp] "\n"] 
    close $fp 
    lset lines 5 {TESTT} 
    set fp [open $flnm w] 
    puts $fp [join $lines \n] 
    close $fp 
    
  2. 第二種情況;如何更換範圍線?

回答

0

數據以最後一個換行符開頭;因爲split正在使用它作爲分隔符,這會在其生成的列表結尾處產生一個空元素。 然後,當你寫出來,join重新創建文件的內容(受你添加的改動)和puts後添加一個換行符,因爲puts被記錄爲做到這一點。

你可能想使用-nonewline選項,因爲你採取的新行的控制自己:

puts -nonewline $fp [join $lines \n] 

要更換一系列的列表的元素(因此行範圍內) ,你應該使用lreplace命令。但是,它會獲取一個列表值並返回一個列表值;它不會像lset那樣進行就地編輯:

set insertion [list "insert me #1" "insert me #2" "insert me #3" "insert me #4"] 
set lines [lreplace $lines 5 7 {*}$insertion] 
+0

第一種情況是完美的。非常感謝,唐納德! – Andre

+0

@Andre,你也可以使用'read -nonewline'而不是'puts -nonewline' - 當你獲取數據時會處理這個問題,所以你的行列表已經沒有空的最後一個元素。 –