如何以所需格式显示输入

时间:2011-08-25 06:58:36

标签: tcl

输入文件包含一些内容,例如:

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

3 个答案:

答案 0 :(得分:1)

split将输入分解为行foreach以迭代它们,regexp从这些行中提取相关的字符组format以构造结果字符串(在Tcl中通常不需要format,因为字符串中的简单变量替换通常适用于常见情况。)

阅读thisthisthisthis。对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]
}