我需要从ruby中的给定文件中提取匹配模式中的每两行

时间:2016-07-16 09:37:56

标签: ruby regex

我在文件中有以下行

name
place
time
create
delete
time
update
modify
time
teach
lesson
chapter
section
time
source
code
them
time
view
print
kill

我的要求是,我需要匹配该行中的“时间”一词,我需要从文件中提取每一行。同样,我可能在文件中的“时间”模式之后有n行,但只打印确切的第二行    输出看起来像

delete
modify
lesson
code
print

我是如何用红宝石做到的?

n=0
f = File.open("30.txt")
f.each do |line|
    n=n+1
    if line=~/time/
        puts "#{n}: #{line}"
    end
end
f.close

2 个答案:

答案 0 :(得分:1)

要做到这一点并不难。诀窍在于有两个状态,一个是你在线上寻找“时间”字符串,另一个是你找到它时你跟踪出现在哪一行:

time_line = nil

DATA.readlines.each_with_index do |line, i|
  if time_line and ((i - time_line) % 2) == 0
    # n % 2 == 0 only triggers on even lines.
    puts line
  else
    if line.match(/time/)
      time_line = i
    end
  end
end

# This shows up as DATA, but you can use $stdin or another File just the same
__END__
name
place
time
create
delete
time
update
modify
time
teach
lesson
time
source
code
time
view
print

答案 1 :(得分:1)

这是另一种方式:

words = File.readlines("30.txt")
puts words.to_enum.with_index.collect{|word, i| word =~ /^time/ ? words[i+2] : nil}.compact

这会产生所需的输出:

delete
modify
lesson
code
print

说明:

  • words是文件中的一行数组。
  • 我想使用with_index,但这只适用于枚举器,所以我必须在数组上调用to_enum
  • with_index允许我collect单词“time”的实例,然后在索引+ 2
  • 处获取单词
  • compact摆脱了不匹配的空行。

我急忙想出来,可能会进一步缩短。