2016-01-10 73 views
0

我已經嘗試了下面的代碼,但它正在逐行檢查並希望在整個文件中檢查它。請幫我在寫正確的代碼,一旦我得到的模式打破它和模式以極格局沒有找到我想在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'" 
    } 
} 

回答

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元字符的情況。


string first命令很簡單,所以很容易被正確使用,制定出它是否可以做你想做的。 lsearch命令根本不簡單,也不是正則表達式;確定何時以及如何使用它們相應地更棘手。