2013-06-22 61 views
0

我在Ruby中的新手。 我有一個樣品(輸入文本),如:紅寶石:複製兩行

Message: 
update attributes in file and commit version 
---- 
Modified 

我需要把線上行後「消息」標籤。請注意,此行可以與親近「消息」之類

Message:update attributes in file and commit version 

我已經試過這樣:

if line =~/Message/ 

但是,當然,它不會搜索的下一行。

誰能幫我如何捕捉標記之間的「消息」和「---」 如果你知道一些例子,請鍵入鏈接

更新行:整個代碼

require 'csv' 
data = [] 
File.foreach("new7.txt") do |line| 
    line.chomp! 
    if line =~ /Revision/ 
    data.push [line] 
    elsif line =~ /Author/ 
    if data.last and not data.last[1] 
     data.last[1] = line 
    else 
     data.push [nil, line] 
    end 
    elsif line=~/^Message:(.*)^-/m 
    if data.last and not data.last[2] 
     data.last[2] = line 
    else 
     data.push [nil, nil, line] 
    end 
    end 
end 

CSV.open('new1.csv', 'w') do |csv| 
    data.each do |record| 
    csv << record 
    end 
    enter code here 

輸入文件:

Revision: 37407 
Author: imakarov 
Date: 21 июня 2013 г. 10:23:28 
Message:my infomation 
dmitry name 

輸出CSV文件: enter image description here

回答

2

您可以使用/^Message:(.*)^---/m爲您的正則表達式。 /m允許您跨線邊界進行匹配。見http://rubular.com/r/FhqiKx0XyI

更新#1:這是從IRB輸出示例:

Peters-MacBook-Air-2:bot palfvin$ irb 
1.9.3p194 :001 > line = "\nMessage:first-line\nsecond-line\n---\nthird-line" 
=> "\nMessage:first-line\nsecond-line\n---\nthird-line" 
1.9.3p194 :002 > line =~ /^Message:(.*)^-/m 
=> 1 
1.9.3p194 :003 > $1 
=> "first-line\nsecond-line\n" 
1.9.3p194 :004 > 
+1

我只是檢查和其他類似的問題已經被問過SO /回答。你先搜索了嗎?我想知道我們是否應該將其標記爲重複或者是否有讓您找不到的東西。 –

+0

@PeterAlfin非常感謝你!但它是正確的,如果我用這個表達是這樣的:如果行=〜/ ^消息:(*)^ -/Unfortunetely它不工作 –

+0

不,你需要用'M'在表達式的末尾(繼尾隨斜線)。這是關鍵的推動因素。 –