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

How to remove last subdir from path using tcl?

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

我想删除最后一个子目录变成这样:

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

如何使用 TCL 实现?

谢谢

好吧,如果您不介意使用正斜杠和非训练斜杠,您可以尝试使用 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\

还是非重解;拆分和合并:

% 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 会知道您提供的路径何时是最高级别,而其他解决方案则不会(它们 return 空字符串):

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

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

%

我建议只使用 file 子命令,即 file split and 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 文件路径)。如果您需要 OS-native 文件路径,请使用 file nativename 作为最后一步:

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

(这恰好与我 OS 上的 Tcl 路径相同,但在 Windows 上,这将显示反斜杠作为分隔符。)