2010-10-29 7 views
18

मैं रूबी के लिए नया हूं और उम्मीद कर रहा था कि कोई मुझे फाइल खोलने के तरीके को समझने में मदद कर सकता है, फिर कई स्थितियों को ढूंढने और बदलने के लिए gsub का उपयोग कर सकता है।रूबी - खुली फ़ाइल, एकाधिक लाइनों को ढूंढें और बदलें

यहाँ मैं अब तक क्या मिला है, लेकिन यह 2 के रूप में काम वर को बदलने के लिए प्रतीत नहीं होता ओवरराइड करता है पहला:

text = File.read(filepath) 
replace = text.gsub(/aaa/, "Replaced aaa with 111") 
replace = text.gsub(/bbb/, "Replace bbb with 222") 
File.open(filepath, "w") {|file| file.puts replace} 

उत्तर

25

बदलें

replace = replace.gsub(/bbb/, "Replace bbb with 222") 
+0

धन्यवाद यह काम किया। – oprogfrogo

17

आप मूल "पाठ" हर बार, दूसरी पंक्ति से बदल रहे हैं

replace = replace.gsub(/bbb/, "Replace bbb with 222") 
+0

धन्यवाद इस काम किया:

यह सिर्फ के रूप में अच्छी बहु लाइन काम करता है। – oprogfrogo

8

एक दिलचस्प WRI के लिए तीसरी लाइन: की जगह बदलने की जरूरत है यह करने के लिए nkle है अगर आप नहीं चाहते कि डेटा को पुनः स्कैन करना, gsub के ब्लॉक फार्म का उपयोग करना चाहते हैं:

replace = text.gsub(/(aaa|bbb)/) do |match| 
    case match 
    when 'aaa': 'Replaced aaa with 111' 
    when 'bbb': 'Replace bbb with 222' 
    end 
end 

यह काम करने के लिए सबसे कारगर तरीका नहीं हो सकता है, लेकिन यह एक अलग तरह को देखने के लिए है मुसीबत। यदि प्रदर्शन आपके लिए महत्वपूर्ण है तो दोनों तरीकों से बेंचमार्किंग करें।

+0

अच्छा, मुझे कल्पना है कि पैटर्न को दो बार संकलित करने से रोकता है। – DigitalRoss

2

मैं इसे इस तरह लिखने के लिए परीक्षा हो सकती है ...

#!/usr/bin/env ruby 

filepath = '/tmp/test.txt' 

File.open filepath, 'w' do |f| 
    $<.each_line do |line| 
    f.puts line.gsub(/aaa/, 
     'Replaced aaa with 111').gsub /bbb/, 'Replace bbb with 222' 
    end 
end 
2

यहाँ एक एक लाइनर

IO.write(filepath, File.open(filepath) {|f| f.read.gsub(/aaa|bbb/) {|m| (m.eql? 'aaa') '111' : '222'}}) 

IO.write डिफ़ॉल्ट रूप से दिए गए फ़ाइल ट्रंकेटस है, तो आप पहले पाठ को पढ़ने अगर , regex String.gsub निष्पादित करें और परिणामी स्ट्रिंग को ब्लॉक मोड में File.open का उपयोग करके वापस करें, यह फ़ाइल की सामग्री को प्रतिस्थापित करेगा। निफ्टी सही है?

IO.write(filepath, File.open(filepath) do |f| 
    f.read.gsub(/aaa|bbb/) do |m| 
     (m.eql? 'aaa') '111' : '222' 
    end 
    end 
) 
संबंधित मुद्दे