喜欢Here文档的技巧,但是如果你想直接处理文件,这里有另一种解决方案,它使用pos和rewind(对不起,文件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')