2016-05-30 54 views
2

我有以下文件:如何將兩個單詞之間的大量信息保存到文件中?

old_file

new_file 
    Some string. 
end 

Text in the middle that is not supposed to go to any of files. 

new_file 
    Another text. 
end 

如何使用正則表達式我可以創建兩個文件具有以下內容:

文件1

new_file 
    Some string. 
end 

file2

new_file 
    Another text. 
end 

我怎樣才能得到它是關鍵字「NEW_FILE」和「結束」將其寫入到文件之間的信息?

+3

如果您可以以一個字符串讀取文件,請使用['/^new_file$.*?'end$/m'](http://rubular.com/r/MeVuqOfpyz) –

+0

@WiktorStribiżew我可以創建幾個文件如果我一次只讀一次舊文件? –

+1

另一種方式顯示在這裏:http://stackoverflow.com/questions/6632784/ruby-print-selected-lines-of-text-in-between-2-string –

回答

2

如果文件沒有那麼大,你可以在閱讀它們作爲一個字符串,(使用File.read(file_name)),然後運行下面的正則表達式:

file_contents.scan(/^new_file$.*?^end$/m).select { |block| WRITE_TO_FILE_CODE_HERE } 

regex demo

^new_file$.*?^end$正則表達式匹配new_file這是一整行內容,然後0+任何字符儘可能少(包括換行一個。 s使用/m修飾符),然後使用end(整行)。

否則,你可能在起跑線上找到適應this answer here作爲

printing = false 
File.open(my_file).each_line do |line| 
    printing = true if line =~ /^new_file$/  
    puts line if printing 
    printing = false if line =~ /^end$/ 
end 

打開文件,寫它在那裏puts line是在上面的例子中,當printing false時關閉。

+0

很棒的回答。我可以檢查一切,然後接受嗎? –

+1

當然,慢慢來。 –

+0

Виктор,你真的很棒;)我希望我知道正則表達式和你一樣好。也許你可以帶幾本書? –

1

您可以通過塊通過改變也讀文件塊什麼構成紅寶石「線」:

File.open("file1.txt", "w") do |file1| 
    File.open("file2.txt", "w") do |file2| 
    enum = IO.foreach("old_file.txt", sep="\n\n") 
    file1.puts enum.next.strip 
    enum.next #discard 
    file2.puts enum.next.strip 
    end #automatically closes file2 
end #automatically closes file1 

通過指定分隔符爲「\ n \ n」個紅寶石將讀取所有的字符,直到達到幷包括兩條連續的換行符 - 並將其作爲「行」返回。