2016-12-05 89 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' - 当你获取数据时会处理这个问题,所以你的行列表已经没有空的最后一个元素。 –