TCL regsub替换文件名中的last/in

TCL regsub替换文件名中的last/in,tcl,regsub,Tcl,Regsub,要将文件名中的最后一个/替换为:,我尝试了以下代码 set x a/b/c regsub {.*(\/)\S+$} $x {:} 不希望出现的结果是: 所需的结果是a/b:c 示例: a -> a a/b -> a:b aa/b -> aa:b aa/bb/.../dd/e -> aa/bb/.../dd:e 感谢您的反馈。对于正则表达式,您可以说 set new [regsub {/([^/]+)$} $x {:\1}] ;# ==> a/b:c

要将文件名中的最后一个
/
替换为
,我尝试了以下代码

set x a/b/c
regsub {.*(\/)\S+$} $x {:}
不希望出现的结果是

所需的结果是
a/b:c

示例:

a -> a
a/b -> a:b
aa/b -> aa:b
aa/bb/.../dd/e -> aa/bb/.../dd:e

感谢您的反馈。

对于正则表达式,您可以说

set new [regsub {/([^/]+)$} $x {:\1}]       ;# ==> a/b:c

foreach d {a a/b aa/b aa/bb/.../dd/e} {puts "$d => [regsub {/([^/]+)$} $d {:\1}]"}
# a => a
# a/b => a:b
# aa/b => aa:b
# aa/bb/.../dd/e => aa/bb/.../dd:e
或者,使用

第二个选项的问题是,如果字符串不包含斜杠,则会得到
a
=>
:a
,因此需要执行以下操作:

foreach d {a a/b aa/b aa/bb/.../dd/e} {
    set new [expr {[string first / $d] == -1 ? $d : "[file dirname $d]:[file tail $d]"}]
    puts "$d -> $new"
}

使用正则表达式,您可以说

set new [regsub {/([^/]+)$} $x {:\1}]       ;# ==> a/b:c

foreach d {a a/b aa/b aa/bb/.../dd/e} {puts "$d => [regsub {/([^/]+)$} $d {:\1}]"}
# a => a
# a/b => a:b
# aa/b => aa:b
# aa/bb/.../dd/e => aa/bb/.../dd:e
或者,使用

第二个选项的问题是,如果字符串不包含斜杠,则会得到
a
=>
:a
,因此需要执行以下操作:

foreach d {a a/b aa/b aa/bb/.../dd/e} {
    set new [expr {[string first / $d] == -1 ? $d : "[file dirname $d]:[file tail $d]"}]
    puts "$d -> $new"
}