TCL regsub заменить последний / в имени файла - PullRequest
0 голосов
/ 24 октября 2018

Для замены последнего / в имени файла на : я попробовал следующий код.

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

Обратная связь приветствуется.

1 Ответ

0 голосов
/ 24 октября 2018

С помощью регулярного выражения вы можете сказать

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"
}
...