2012-10-22 296 views
1

我有一個腳本,可以telnet到一個盒子中,運行一個命令並保存輸出。在解析完輸出文件後,我運行另一個腳本,將它與位於另一個文件中的關鍵詞進行比較以進行匹配。如果一行匹配,它應該將整行(從原始telnet輸出)保存到一個新文件。比較數組匹配的字符串

這裏是一個與解析文本涉及腳本的一部分:

def parse_file 
    filter = [] 
    temp_file = File.open('C:\Ruby193\scripts\PARSED_TRIAL.txt', 'a+') 
    t = File.open('C:\Ruby193\scripts\TRIAL_output_log.txt') 
    filter = File.open('C:\Ruby193\scripts\Filtered_text.txt').readlines 
    t.each do |line| 
     filter.each do |segment| 
      if (line =~ /#{segment}/) 
       temp_file.puts line 
      end 
     end 
    end 
    t.close() 
    temp_file.close() 
end 

目前,它只是節省了位於陣列filter上次運行字符串和保存,爲temp_file。它看起來像循環不會運行數組中的所有字符串,或不會全部保存它們。我有五個字符串放在文本文件Filtered_text.txt內。它只打印我的最後匹配的行到temp_file

+0

您是否在尋找字符串匹配,或整個單詞?目前,您將獲得子字符串匹配,並且您將跳過與字符大小寫不匹配的任何潛在匹配。 –

回答

3

此(未測試的代碼)將複製的原代碼,只有更簡潔地道:

filter = Regexp.union(File.open('C:\Ruby193\scripts\Filtered_text.txt').readlines.map(&:chomp)) 
File.open('C:\Ruby193\scripts\PARSED_TRIAL.txt', 'a+') do |temp_file| 
    File.foreach('C:\Ruby193\scripts\TRIAL_output_log.txt') do |l| 
    temp_file.puts l if (l[filter]) 
    end 
end 

爲了給你一個想法發生了什麼:

Regexp.union(%w[a b c]) 
=> /a|b|c/ 

這給你一個正則表達式這將遍歷字符串尋找任何子字符串匹配。這是一個區分大小寫的搜索。

如果你想關閉這些漏洞,使用類似:

Regexp.new(
    '\b' + Regexp.union(
    File.open('C:\Ruby193\scripts\Filtered_text.txt').readlines.map(&:chomp) 
).source + '\b', 
    Regexp::IGNORECASE 
) 

使用與上述相同的樣品輸入數組會導致其中,:

/\ba|b|c\b/i 
+0

This Works!謝啦! – user1766335