我有一个脚本,该脚本将其伸入一个框中,运行命令并保存输出。在此之后,我运行另一个脚本,该脚本通过输出文件解析,将其与位于另一个文件中的关键单词进行比较。如果匹配行,则应将整个行(从原始的telnet-utput)保存到新文件。
这是处理解析文本的脚本的一部分:
def parse_file
filter = []
temp_file = File.open('C:Ruby193scriptsPARSED_TRIAL.txt', 'a+')
t = File.open('C:Ruby193scriptsTRIAL_output_log.txt')
filter = File.open('C:Ruby193scriptsFiltered_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
。
此(未经测试的代码)将重复原始代码,仅更简洁,惯用:
filter = Regexp.union(File.open('C:Ruby193scriptsFiltered_text.txt').readlines.map(&:chomp))
File.open('C:Ruby193scriptsPARSED_TRIAL.txt', 'a+') do |temp_file|
File.foreach('C:Ruby193scriptsTRIAL_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:Ruby193scriptsFiltered_text.txt').readlines.map(&:chomp)
).source + 'b',
Regexp::IGNORECASE
)
使用与上述相同的样品输入阵列的哪个将导致:
/ba|b|cb/i