使用tcl

时间:2017-03-13 07:43:03

标签: tcl

打算使用tcl提取目录路径的值。目录路径如下所示:

C:\working\636-3419-3\S80\FILE

由于不同PC上的用户不同,目录路径并不总是相同,有些是:

C:\Users\name\351-3100-11\Desktop
Z:\backup\S70\721Z3121-3\FILE

我需要提取值(636-3419-3351-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

由于

4 个答案:

答案 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]

即,

  1. 将文件名拆分为多个部分(Z:\blah,...)。
  2. 查找以任何十进制数字开头的第一个元素的索引。
  3. 使用该索引获取实际元素(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