【问题标题】:Compare Arrays for matching string比较匹配字符串的数组
【发布时间】:2012-10-12 15:40:53
【问题描述】:

我有一个脚本可以远程登录到一个盒子,运行一个命令,然后保存输出。之后我运行另一个脚本,它解析输出文件,将其与位于另一个文件中的关键字进行比较以进行匹配。如果匹配了一行,它应该将整行(从原始 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

【问题讨论】:

  • 您是在寻找子字符串匹配,还是整个单词?目前,您将获得子字符串匹配,并且您将跳过任何与字符大小写不匹配的潜在命中。

标签: ruby arrays string compare telnet


【解决方案1】:

这个(未经测试的代码)将复制原始代码,只是更简洁和惯用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-03-30
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2014-12-30
    相关资源
    最近更新 更多