2017-01-04 69 views
2

我有一個文本文件,需要在廚師食譜中進行編輯。 我需要找到這個特定的行(粗體),並在其下面插入配置。Ruby在文件中找到一行,並在其下面添加

. 
. 
. 
# PLACE YOUR CONFIGURATION MEMORY start up here : 
<INSERT MEMORY ARGUMENTS HERE> 
. 
. 
. 
. 

這是我一直trying..I只是想知道有沒有用Ruby 某種功能,在那裏我能找到一個線,然後將該行的下面添加新條目?

ruby_block "edit the configuration file " do 
    block do 
    text = File.read(file_name) 
    replace = text.sub(/# PLACE YOUR CONFIGURATION MEMORY start up here :/, "MEM_ARGS=-Xms512m -Xmx1024m"); 
    File.write(file_name, replace) 
    end 
end 

我不想雖然更換註釋部分,我只是想利用它作爲一個錨,我可以在文本中添加新行。

回答

2

試試這個

File.open('input') do |i| 
    File.open('output', 'w') do |o| 
    while line = i.gets 
     o.puts line 
     if line.chomp == "# PLACE YOUR CONFIGURATION MEMORY start up here:" 
     o.puts "MEM_ARGS=-Xms512m -Xmx1024m" 
     end 
    end 
    end 
end 
`mv output input` 

這是如何工作的?

  • 首先打開輸入文件,將失敗,Errno::ENOENT如果不存在
  • 它然後打開輸出文件
  • 流過它們逐行後
  • 插入附加的行的標記行,chomp移除了尾隨換行
  • do end塊自動關閉這兩個文件
  • 最終用mv替換輸入
+0

對於讀取的文件,你喜歡'open'和'gets'到'IO.foreach('input')do | line | ...'嗎? –

+0

好的結果,如果輸入不存在,而不僅僅是失敗,那麼它會縮短OTOH File.open {File.foreach {...}}將創建一個空輸出文件。 – akuhn

+0

我認爲需要考慮兩種類型的失敗:文件不存在;並且文件不包含文本標記(包括文件爲空)。如果文件具有可管理的大小,則可能最容易在數組中構造輸出文件,如果一切正常,則將該數組寫入文件。 –

3

在廚師裏做這件事的正確方法是line cookbook,它有管理這種就地文件操作的資源。然而,我們強烈建議不要使用它,因爲寫一個壞的正則表達式是非常容易的,或者使用非收斂性系統很容易。使用template資源管理整個文件是首選。

相關問題