我想在tcl

时间:2016-01-10 12:46:09

标签: tcl

我已经尝试了下面的代码,但它是逐行检查并想要在整个文件中检查它。请帮助我写出正确的代码,一旦我得到模式打破它并说模式被发现其他模式没有找到

set search "Severity Level: Critical"
set file [open "outputfile.txt" r]
while {[gets $file data] != -1} {
    if {[string match *[string toupper $search]* [string toupper $data]] } {
        puts "Found '$search' in the line '$data'"
    } else {
        puts "Not Found '$search' in the line '$data'"
    }
}

1 个答案:

答案 0 :(得分:2)

如果文件相对于可用内存“小”(例如,不超过几百兆字节),则查找字符串是否存在的最简单方法是将其全部加载到read

set search "Severity Level: Critical"
set f [open "thefilename.txt"]
set data [read $f]
close $f

set idx [string first $search $data]
if {$idx >= 0} {
    puts "Found the search term at character $idx"
    # Not quite sure what you'd do with this info...
} else {
    puts "Search term not present"
}

如果您想知道它在哪条线上,您可以将数据拆开,然后使用lsearch和正确的选项进行查找。

set search "Severity Level: Critical"
set f [open "thefilename.txt"]
set data [split [read $f] "\n"]
close $f

set lineidx [lsearch -regexp -- $data ***=$search]
if {$idx >= 0} {
    puts "Found the search term at line $lineidx : [lindex $data $lineidx]"
} else {
    puts "Search term not present"
}

***=是一个特殊的转义,可以说“将RE的其余部分视为文字字符”,并且它非常适用于您无法确定搜索字词是否没有RE元字符的情况。 / p>

string first命令非常简单,因此很容易正确使用并确定它是否可以执行您想要的操作。 lsearch命令根本不简单,也不是正则表达式;确定何时以及如何使用它们相应地比较棘手。