On 22.06.2008 06:16, James Dinkel wrote:
> Here is my current method for editing files:
> 
> <code>
> 
>   filename = File.join('path', 'to', 'file')
>   content = []
>   File.open(filename, 'r') do |file|
>     content = file.readlines
>   end
> 
>   content.collect! do |line|
>     line.gsub!(/six/, "half a dozen")
>     line.chomp
>   end
> 
>   File.open(filename, 'w') do |file|
>     file.write content.join($/)

This is a killer because it will transform the whole file into a single 
String just for printing.  You better do either of this

1. just do "file.puts content"

2. work with String the whole way, i.e.

content = File.read file_name
content.gsub! /six/, "half a dozen"
File.open(file_name, "w") {|io| io.write content}

First alternative has the advantage of being a smaller change to your 
code and also I believe it's nicer to the GC; second solution has the 
advantage that you can do multiline replacements.

>   end
> 
> </code>
> 
> This is expensive though, as it rewrites the entire file, even if only a
> single word in the whole file is changed.  I'm wondering if there is a
> better way to do this.

For text files the situation is usually this: the replacement has 
different length than the original.  Thus, you need to at least rewrite 
all the stuff from the original string's starting position on.  The code 
becomes a bit more complex and if the file is small it's probably not 
worthwhile.

Note also that there is command line option -i which will allow for easy 
  inline edits:

ruby -i.bak -pe 'gsub /six/, "half a dozen"' your_file

You can also use it in scripts:

#!/bin/ruby -i.bak -p
gsub /six/, "half a dozen"

Kind regards

	robert