输入文件包含一些内容,例如:
15-05-2011 16:05 <DIR> .
15-05-2011 16:05 <DIR> ..
24-04-2011 16:07 <DIR> Administrator
15-05-2011 16:05 <DIR> confuser
01-02-2011 20:57 <DIR> Public
29-01-2011 19:28 <DIR> TechM
12-08-2011 09:36 <DIR> vt0013487
我需要在命令行参数
中提供文件名输出为所需格式:
Administrator 24-04-2011 16:07
confuser 15-05-2011 16:05
Public 01-02-2011 20:57
TechM 29-01-2011 19:28
vt0013487 12-08-2011 09:36
答案 0 :(得分:1)
split
将输入分解为行foreach
以迭代它们,regexp
从这些行中提取相关的字符组format
以构造结果字符串(在Tcl中通常不需要format
,因为字符串中的简单变量替换通常适用于常见情况。)
阅读this,this,this和this。对regexp
匹配引擎使用的语法也this。
此外,我怀疑您可能正在尝试使用exec
'dir
命令生成的输出,而不是使用glob
本地遍历目录和文件。如果是这样,这是错误的,请使用glob
答案 1 :(得分:1)
所以你要做一些固定宽度字段输入解析,除了最后一个字段是可变长度并延伸到行尾。这很容易。唯一令人尴尬的是我们需要读取所有行以获得输出格式的第一个字段的宽度。
假设您在stdin上提供输入(即通过重定向)并希望它在stdout上(因此您也可以将其重定向到文件):
##### Read in and compute the width
set len 0
while {[gets stdin line] >= 0} {
set date [string range $line 0 16]
set name [string range $line 36 end]
lappend lines $name $date
if {[string length $name] > $len} {
set len [string length $name]
}
}
##### Write out as formatted
foreach {name date} $lines {
puts [format "%-*s %s" $len $name $date]
}
答案 2 :(得分:1)
这可能无法解答您的问题:如果您正在致电cmd /c dir
,可以通过以下方式在Tcl中进行操作:
package require struct::list
set files [glob *]
set maxlen [tcl::mathfunc::max {*}[struct::list map $files {apply {s {string length $s}}}]]
foreach file [lsort $files] {
set datetime [clock format [file mtime $file] -format {%d-%m-%Y %H:%M}]
puts [format {%-*s %s} $maxlen $file $datetime]
}