Ruby - 从数组中的一行中提取一个字符串,并将其放在以下行的开头

时间:2014-05-09 07:30:27

标签: ruby regex

我正在处理日志文件,我需要从一行复制一个字符串并将其复制到下一行的开头...请帮助[Ruby和&正则表达式]

这是我的输入

18:07:12 grd TIMESTAMP 2/2/2014
12:19:24   IN A2010 drosa SA400583
12:19:24   IN A2010 dsrosa SA456583
0:07:26 grd TIMESTAMP 2/3/2014
22:19:24   IN A2010 dosa SA400583
22:10:21   IN A2010 dsrosa SA456583

我想取日期即2/2/2014并将其放在以下行的开头,直到找到下一个时间戳,即2/3/2014 ...预期输出为

2/2/2014 12:19:24   IN A2010 drosa SA400583
2/2/2014 12:19:24   IN A2010 dsrosa SA456583
2/3/2014 22:19:24   IN A2010 dosa SA400583
2/3/2014 22:10:21   IN A2010 dsrosa SA456583

请帮忙。干杯

1 个答案:

答案 0 :(得分:1)

您可以使用Enumerable#slice_before查找以特定模式开头的块:

input = <<EOD.lines
18:07:12 grd TIMESTAMP 2/2/2014
12:19:24   IN A2010 drosa SA400583
12:19:24   IN A2010 dsrosa SA456583
0:07:26 grd TIMESTAMP 2/3/2014
22:19:24   IN A2010 dosa SA400583
22:10:21   IN A2010 dsrosa SA456583
EOD

input.slice_before(/TIMESTAMP/).each do |first_line, *other_lines|
  timestamp = first_line[/\d+\/\d+\/\d+/]
  other_lines.each do |line|
    puts "#{timestamp} #{line}"
  end
end

输出:

2/2/2014 12:19:24   IN A2010 drosa SA400583
2/2/2014 12:19:24   IN A2010 dsrosa SA456583
2/3/2014 22:19:24   IN A2010 dosa SA400583
2/3/2014 22:10:21   IN A2010 dsrosa SA456583

我已使用/TIMESTAMP/(包含单词TIMESTAMP的行)作为模式,/grd/也可以使用。使用String#[]从每个第一行提取实际时间戳(2/2/2014)。请注意,input是一个数组。