如何使用tcl从路径中删除最后一个子目录?

如何使用tcl从路径中删除最后一个子目录?,tcl,Tcl,我想删除最后一个细分曲面,使其变成这样: c:\root\machine\spec\detail\ z:\test\room\tool\ 如何使用TCL实现这一点 谢谢如果您不介意使用正斜杠和非训练斜杠,您可以尝试使用: c:\root\machine\spec\ z:\test\room\ 否则,如果你想保持你在问题中提到的一切,那么我想快速回答一下就可以了: % set line "c:\\root\\machine\\spec\\detail\\" c:\root\machine\sp

我想删除最后一个细分曲面,使其变成这样:

c:\root\machine\spec\detail\
z:\test\room\tool\
如何使用TCL实现这一点

谢谢

如果您不介意使用正斜杠和非训练斜杠,您可以尝试使用:

c:\root\machine\spec\
z:\test\room\
否则,如果你想保持你在问题中提到的一切,那么我想快速回答一下就可以了:

% set line "c:\\root\\machine\\spec\\detail\\"
c:\root\machine\spec\detail\
% file dirname $line
c:/root/machine/spec
或非再结晶溶液;拆分和联接:

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

不同之处在于,
file
将知道您提供的路径何时为最高级别,而其他解决方案则不知道(它们返回空字符串):


我建议只使用
文件
子命令,也就是说,和(无论调整文件路径的目的是什么):

这将使脚本更具可移植性(规范的Tcl文件路径)。如果需要具有操作系统本机文件路径,请作为最后一步使用:

% 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路径相同,但在Windows上,这将显示反斜杠作为分隔符。)

file dirname
(正如Jerry所写)加上
file nativename
也会这样做,但上面的方法更通用(您可以决定去掉几个路径级别)。为什么要重复两次文件连接?
% set line "c:\\"
c:\
% file dirname $line
c:/
% regsub {[^\\]+\\$} $line ""

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

%
% 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
% file nativename $baseDir
c:/root/machine/spec