我已经尝试了下面的代码,但它是逐行检查并想要在整个文件中检查它。请帮助我写出正确的代码,一旦我得到模式打破它并说模式被发现其他模式没有找到
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'"
}
}
答案 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
命令根本不简单,也不是正则表达式;确定何时以及如何使用它们相应地比较棘手。