2013-08-01 84 views
1

看起来像一个基本任务,但我想要一个以某种东西结尾的字符串,并用其他东西替换最后3个字母。这里是我的尝试:正确操纵TCL中的字符串

set v "this is bob" 
set index2 [string length $v] 
set index1 [expr $index2 - 3] 
set result [string replace $v index1 index2 dog] 
puts $result; # I want it to now say "this is dog" 

编辑:忘了提,它给我的错误信息是:

 
bad index "index1": must be integer?[+-]integer? or end?[+-]integer? 
    while executing 
"string replace $v index1 index2 .hdr" 
    invoked from within 
"set result [string replace $v index1 index2 .hdr]" 
    (file "string_manipulation.tcl" line 7) 
+0

只是为了好奇,你为什么假设最后一个单词总是3个字母? – Varun

+0

由于我将使用文件扩展名.am,并且我想用.hdr替换它以保存为不同的输出。 – elefun

回答

3

这是一种方法。 TCL识别标记,如endend-1end-2,......你想要的是从end-2end取代:

set v "this is bob" 
set result [string replace $v end-2 end "dog"] 
# Result now is "this is dog" 

更新

如果你想要做的是替换文件扩展名,然后使用file rootname删除扩展,然后加上自己:

set v filename.arm 
set result [file rootname $v].hdr; # Replaces .arm with .hdr 

该解决方案具有不同长度,不举的扩展工作的优势st 3.

+2

+1。或者,保留除最后3个字符外的所有字符:'set result'[字符串范围$ v 0结尾-3]狗“' –

+0

我喜欢这个,简单得多 – elefun

3

容易,你忘了你在TCL右侧接近尾声。您不是通过的值索引1索引2,而是传入字符串“index1”和“index2”。所以只需添加缺失的美元符号:

set result [string replace $v $index1 $index2 dog] 

瞧! :-)

+0

现在,我不觉得愚蠢。那些该死的美元符号总是躲过我 – elefun