2010-10-29 29 views
18

Tôi mới dùng ruby ​​và hy vọng ai đó có thể giúp tôi tìm cách mở tệp, sau đó sử dụng gsub để tìm và thay thế bằng nhiều điều kiện.Ruby - Mở tệp, tìm và thay thế nhiều dòng

Dưới đây là những gì tôi có cho đến nay nhưng điều này dường như không làm việc là một trong 2 thay var đè đầu tiên:

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} 

Trả lời

25

thay đổi dòng thứ ba để

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

Cảm ơn bạn đã làm việc này. – oprogfrogo

17

Bạn đang thay thế từ "văn bản" gốc mỗi lần, dòng thứ hai cần phải thay thế thay thế:

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

Cảm ơn này làm việc. – oprogfrogo

8

Một WRI thú vị nkle vấn đề này là nếu bạn không muốn để quét lại các dữ liệu, sử dụng các hình thức khối gsub:

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

Điều này có thể không phải là cách hiệu quả nhất để làm điều này, nhưng đó là một cách khác để nhìn vào vấn đề. Đáng giá cả hai cách nếu hiệu suất quan trọng với bạn.

+0

Tốt, tôi tưởng tượng cũng ngăn việc biên dịch mẫu hai lần. – DigitalRoss

2

tôi có thể bị cám dỗ để viết nó như thế này ...

#!/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

Đây là một lót một

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

IO.write truncates các tập tin trao theo mặc định, vì vậy nếu bạn đọc những văn bản đầu tiên , thực hiện regex String.gsub và trả về chuỗi kết quả bằng cách sử dụng File.open ở chế độ chặn, nó sẽ thay thế nội dung của tệp. Tiện lợi đúng không?

Nó hoạt động giống như cũng đa dòng:

IO.write(filepath, File.open(filepath) do |f| 
    f.read.gsub(/aaa|bbb/) do |m| 
     (m.eql? 'aaa') '111' : '222' 
    end 
    end 
) 
Các vấn đề liên quan