打算使用tcl提取目录路径的值。目录路径如下所示:
C:\working\636-3419-3\S80\FILE
由于不同PC上的用户不同,目录路径并不总是相同,有些是:
C:\Users\name\351-3100-11\Desktop
Z:\backup\S70\721Z3121-3\FILE
我需要提取值(636-3419-3
或351-3100-11
...这些数字总是不同的)并设置为变量(mom_number
),稍后我会使用它({{ 1}})。
我试图在斜杠上拆分路径,但是在其他情况下,我不知道如何只取出数值。请帮助解释代码示例。非常感谢。
这是我写的代码,只能提取636 .....
$mom_number
(set mom_pn_number $mom_part_name
# Separate data with the character "\"
set pn_num [split $mom_pn_number \\]
# To search for the number from the separated data
set pn_number [lsearch -inline $pn_num 636*]
set mom_part_number $pn_number
是完整的目录路径),我不知道if和else语句是否有效,但总是出错。
数字可以是0到9之间的任何类型,就像不同产品的序列号一样。我尝试使用$mom_part_name
分割路径,它使用由空格分隔的输出。
至于
[split $mom_pn_number \\]
我的意图结果是C:\Users\name\351-3100-11\Desktop
。
如果某些用户将其文件保存在其他目录中,如下所示:
351-3100-11
我的意图结果是Z:\backup\S70\721Z3121-3\FILE
。
由于
答案 0 :(得分:0)
不要将split
用于文件名。在规范化名称上使用file split
(因为它处理一堆棘手的情况)(以防止出现丑陋的意外)。然后使用正确模式的lsearch
;这个似乎更容易用正则表达式表达。
set items [file split [file normalize $mom_part_name]]
set mom_part_number [lsearch -inline -regexp $items {^[-0-9]+$}]
关键是假设所有零件编号都是数字和短划线,如果你想在RE字符集中使用破折号,那么你必须先将它们放在第一位。
答案 1 :(得分:0)
对于C:\Users\name\XYZ-nnnn-nn\Desktop
样式路径名
set fname {C:\Users\name\XYZ-nnnn-nn\Desktop}
set nns [lindex [file split $fname] 3]
set pn_number [lindex [split $nns -] 0]
如果你真的想依赖于找到以数字开头的第一个路径组件,那就这样做:
set parts [file split $fname]
set pix [lsearch -glob $parts {[0-9]*}]
set pn_number [lindex [split [lindex $parts $pix] -] 0]
即,
Z:\
,blah
,...)。lindex
),
然后在split
s上-
,然后再取一个lindex
。答案 2 :(得分:0)
试试这个:
set pattern {.*\\(([0-9A-Z]+-?)*)\\.*}
set foo {C:\Users\name\351-3100-11\Desktop}
set bar {Z:\backup\S70\721Z3121-3\FILE}
set result [regexp -inline -all -- $pattern $foo]
if {[llength $result] > 0} {
puts "foo::$foo -> [lindex $result 1]"
}
set result [regexp -inline -all -- $pattern $bar]
if {[llength $result] > 0} {
puts "bar::$bar -> [lindex $result 1]"
}
执行输出:
foo::C:\Users\name\351-3100-11\Desktop -> 351-3100-11
bar::Z:\backup\S70\721Z3121-3\FILE -> 721Z3121-3
答案 3 :(得分:-1)
以下代码正常运行。校验。 SBORDOLO-M-V1VG:实验sbordolo $ vi t5
set a {C:\working\636-3419-3\S80\FILE}
set b {C:\Users\name\351-3100-11\Desktop Z:\backup\S70\721Z3121-3\FILE}
foreach line [list $a $b] {
if {[regexp -- "(\[0-9\]+\[-\]\[0-9\]+\[-\]\[0-9\]+)" $line - dir]} {
puts "yes: $dir"
} else {
puts "not matched"
}
}
SBORDOLO-M-V1VG:EXPERIMENT sbordolo $
tclsh t5
yes: 636-3419-3
yes: 351-3100-11