2016-04-04 27 views
0

Farklı yapılandırma dosyalarını birleştiren bir işlev üzerinde çalışıyorum Bir yapılandırma dosyasında ya da belirli bir sözcüğü gördüğümde (Bu örnekte "Sınama") şunu istiyorum bir Dosya ile değiştirilebilir (metnin Çoklu Hatları) Ben yüzden şimdi sadece combinedconfig ile benim dize "testi" yerine artıkRuby: gsub Dize ile Dosyayı Değiştir

def self.configIncludes(config) 
config = @configpath #path to config 

combinedconfig = @configpath #for test purposes 

doc = File.open(config) 
text = doc.read 
combinedConfig = text.gsub("test" , combinedconfig) 
puts combinedConfig 

için bu var

ama bu çıkışı nerede benim dizinidir config yerleştirilir

Nasıl Yerine Takılır? metni ile? Tüm yardımlar takdir edilmektedir!

+1

"Birleşik arabirim" Dosyasını okumanız gerekiyor. Text.gsub ("test", File.open (kombineconfig, &: read)) 'gibi bir şey ama bununla ne yapmak istediğinize dair% 100 emin değilsiniz. – engineersmnky

+0

Dosya içeriğinizde '' test ''yerine başka bir şeyle mi girmeye çalışıyorsunuz? Belki de geri aldın. – tadman

+0

Hey @tadman iyi çıktı sadece test amaçlıdır (birleştirilmiş Config'i yeni bir Config'e yazacağım) – FroggyFreshh

cevap

0

Dosyalar büyük değilse, aşağıdakini yapabilirsiniz.

def replace_text(file_in, file_out, word_to_filename) 
    File.write(file_out, 
    File.read(file_in).gsub(Regexp.union(word_to_filename.keys)) { |word| 
    File.read(word_to_filename[word]) }) 
end 

word_to_filename

Kod anahtarı word bir word_to_filename[word] adlı dosyanın içeriği ile değiştirilecektir olduğunu karma şekildedir.

Dosyalar büyükse, bu satırı belki de IO#foreach kullanarak yapın. aşağıdaki gibi

Örnek

file_in = "input_file" 
file_out = "output_file" 
File.write(file_in, "Days of wine\n and roses") 
    #=> 23 
File.write("wine_replacement", "only darkness") 
    #=> 13 
File.write("roses_replacement", "no light") 
    #=> 8 
word_to_filename = { "wine"=>"wine_replacement", "roses"=>"roses_replacement" } 

replace_text(file_in, file_out, word_to_filename) 
    #=> 35 
puts File.read(file_out) 

Days of only darkness 
and no light 

açıklama file_in, file_out ve yukarıdaki örnekte kullanılan word_to_filename için

, adımlardır.

str0 = File.read(file_in) 
    #=> "Days of wine\n and roses" 
r = Regexp.union(word_to_filename.keys) 
    #=> /wine|roses/ 

Let ilk regex maç hangi kelimelerde bkz:

str0.scan(r) 
    #=> ["wine", "roses"] 

Sürekli, bilgisayar str1 yılında

str1 = str0.gsub(r) { |word| File.read(word_to_filename[word]) } 
    #=> "Days of only darkness\n and no light" 
File.write(file_out, str1) 
    #=> 35 

, gsub ilk kelimesi "şarap" ile eşleşir. Bu dize nedenle bloğa geçti ve blok değişkene atanır:

word = "wine" 

ve blok hesaplama yapılır:

str2 = word_to_filename[word] 
    #=> word_to_filename["wine"] 
    #=> "wine_replacement" 
File.read("wine_replacement") 
    #=> "only darkness" 

yüzden "şarap" "sadece karanlık" ile değiştirilir. "Güller" eşleşmesi benzer şekilde işlenir.

+0

Cevabınız için teşekkürler @Cary Swoveland – FroggyFreshh