我在文件中有以下行
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
答案 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
摆脱了不匹配的空行。我急忙想出来,可能会进一步缩短。