愛招,但如果你想直接處理文件,這裏是另一種解決方案,發揮POS機和退(抱歉,沒有異常處理文件IO):
def gsub_paragraph(options)
regex_start = /^.*#{options[:pattern_start]}.*$/
regex_stop = /^.*#{options[:pattern_stop]}.*$/
f_read = File.new(options[:file_in], 'r')
true until (line_pattern = regex_start.match(f_read.gets))
pos_start = f_read.pos - line_pattern[0].length - 1
f_read.rewind
part_start = f_read.read(pos_start)
true until (line_pattern = regex_stop.match(f_read.gets))
pos_stop = f_read.pos
part_stop = f_read.read(pos_stop)
f_read.close
f_write = File.new((options[:file_out] || options[:file_in]), 'w+')
replacement = options[:replacement] || ''
f_write.puts part_start + replacement + part_stop
f_write.close
end
file = "gsub_in.txt"
# Output to a designated file other than source file, replace matched part
gsub_paragraph(:file_in => file, :pattern_start => 'pattern 2', :pattern_stop => 'end pattern 2', :replacement => "~~~I replaced sth here~~~\n", :file_out => 'gsub_out.txt')
# Output to a designated file other than source file, without replacement
gsub_paragraph(:file_in => file, :pattern_start => 'pattern 2', :pattern_stop => 'end pattern 2', :file_out => 'gsub_out.txt')
# Output to source file directly, without replacement
gsub_paragraph(:file_in => file, :pattern_start => 'pattern 2', :pattern_stop => 'end pattern 2')
我試着在紅寶石GSUB,但只能刪除/替換單行,而不是一個文本塊。我搜查了,但我找不到適合這項任務的任何東西。 – pfrancesco 2012-08-07 14:48:02
請顯示你寫的代碼。我們寧願告訴你出錯的地方,而不是爲你寫一個完整的解決方案。 – 2012-08-07 17:39:12
您正在處理的文件有多大?如果它是合理的大小,那將適合內存,使用'File.read()'將其完全拉入,然後單個'gsub()'將允許您去除目標線條,然後將結果寫入新文件。請參閱以下有關做文件更改的評論。 – 2012-08-07 17:45:50