2012-10-22 196 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