如何使用 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 上,这将显示反斜杠作为分隔符。)
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 上,这将显示反斜杠作为分隔符。)