Как удалить последний subdir из пути, используя tcl? - PullRequest
0 голосов
/ 28 октября 2019
c:\root\machine\spec\detail\
z:\test\room\tool\

я хочу удалить последний подкаталог, чтобы он стал таким:

c:\root\machine\spec\
z:\test\room\

Как это сделать с помощью TCL?

Спасибо

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Ну, вы можете попробовать использовать file, если вы не против прямой косой черты и не обучающей косой черты:

% set line "c:\\root\\machine\\spec\\detail\\"
c:\root\machine\spec\detail\
% file dirname $line
c:/root/machine/spec

В противном случае, если вы хотите сохранитьвсе, как вы упомянули в своем вопросе, тогда, я думаю, быстрое regsub должно быть в порядке:

% set line "c:\\root\\machine\\spec\\detail\\"
c:\root\machine\spec\detail\
% regsub {[^\\]+\\$} $line ""
c:\root\machine\spec\

Или нереализованное решение;split и join:

% set line "c:\\root\\machine\\spec\\detail\\"
c:\root\machine\spec\detail\
% join [lreplace [split $c "\\"] end-1 end-1] "\\"
c:\root\machine\spec\

Разница будет в том, что file будет знать, когда путь, который вы указываете, имеет максимально возможный уровень, в то время как другие решения не будут (они возвращают пустую строку):

% set line "c:\\"
c:\
% file dirname $line
c:/
% regsub {[^\\]+\\$} $line ""

% join [lreplace [split $c "\\"] end-1 end-1] "\\"

%
0 голосов
/ 28 октября 2019

Я советую просто придерживаться подкоманд file, то есть file split и file join (независимо от цели массирования путей к файлам):

% set pathElements [file split $line]
c: root machine spec detail
% set baseDir [file join {*}[file join [lrange $pathElements 0 end-1]]]
c:/root/machine/spec

Это сделает ваш скрипт более переносимым (канонические пути к файлам Tcl). Если вам нужно иметь собственные пути к файлам ОС, используйте file nativename в качестве последнего шага:

% file nativename $baseDir
c:/root/machine/spec

(Это совпадает с путем Tcl в моей ОС, но в Windows это будет показывать обратную косую черту в качестве разделителей.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...