我正在处理日志文件,我需要从一行复制一个字符串并将其复制到下一行的开头...请帮助[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
请帮忙。干杯
答案 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
是一个数组。