С помощью регулярного выражения вы можете сказать
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
Или использовать команду file
set new [file dirname $x]:[file tail $x] ;# ==> a/b:c
Проблема со вторым параметром заключается весли строка не содержит косую черту, вы получите 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"
}