# Changing a files' content

**URL:** <https://www.ruby-forum.com/t/changing-a-files-content/122070>\
**Category:** Ruby\
**Created:** [December 4, 2007, 10:18am UTC](https://www.ruby-forum.com/t/changing-a-files-content/122070 "2007-12-04T10:18:04Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![fox](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/c5a1d2/32.png) [@fox](https://www.ruby-forum.com/u/fox)\
**Post date:** [December 4, 2007, 10:18am UTC](https://www.ruby-forum.com/t/changing-a-files-content/122070/1 "2007-12-04T10:18:04Z")

</div>

hi all,  
i have a text file with various lines, and i want to alter some of these  
using regex and gsub.

so i have patterns={/some\_pattern/=\>“replacement text”}  
and i’m thinking this:  
in = File.open(filename)  
while (line=in.gets)  
if line.strip =~ pattern  
line.gsub(pattern,patterns[pattern])  
end  
end

but i’m not sure if that’s efficient? and of course, i’m struggling on  
the best way of writing those changes back into the file.

any thoughts?  
thanks,  
f.

---

<div class="post-metadata">

**Author:** ![fox](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/c5a1d2/32.png) [@fox](https://www.ruby-forum.com/u/fox)\
**Post date:** [December 4, 2007, 12:00pm UTC](https://www.ruby-forum.com/t/changing-a-files-content/122070/2 "2007-12-04T12:00:05Z")

</div>

On Dec 4, 2007 10:18 AM, Paul F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> end  
> end

Maybe you would like to do this

ARGF.each | line |  
line.gsub(…) if line…  
print line  
end

and then  
ruby -i.bup source.rb file1, …

HTH  
Robert

–

[http://ruby-smalltalk.blogspot.com/](http://ruby-smalltalk.blogspot.com/)

* * *

All truth passes through three stages. First, it is ridiculed. Second,  
it is violently opposed. Third, it is accepted as being self-evident.  
Schopenhauer (attr.)

---

<div class="post-metadata">

**Author:** ![fox](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/c5a1d2/32.png) [@fox](https://www.ruby-forum.com/u/fox)\
**Post date:** [December 4, 2007, 12:11pm UTC](https://www.ruby-forum.com/t/changing-a-files-content/122070/3 "2007-12-04T12:11:08Z")

</div>

Robert D. wrote:

> ruby -i.bup source.rb file1, …

thanks for the reply the -i flag looks like it’ll be useful, but in my  
current situation, i need to be able to do it via an instance method,  
rather than command line.  
i guess i could call system() to do it, but tht doesn’t seem right?

---

<div class="post-metadata">

**Author:** ![fox](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/c5a1d2/32.png) [@fox](https://www.ruby-forum.com/u/fox)\
**Post date:** [December 4, 2007, 1:22pm UTC](https://www.ruby-forum.com/t/changing-a-files-content/122070/4 "2007-12-04T13:22:48Z")

</div>

On Dec 4, 2007 12:11 PM, Paul F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Robert D. wrote:
> 
> > ruby -i.bup source.rb file1, …
> 
> thanks for the reply the -i flag looks like it’ll be useful, but in my  
> current situation, i need to be able to do it via an instance method,  
> rather than command line.  
> I fail to understand, can you elaborate on the calling environment?  
> Assuming that you cannot use the -i flag I would be tempted to read  
> the file into memory or use tempfile to create a copy of the original  
> file and than open the original file with write access (“w”), if this  
> is not feasible either I would (as a last resort ) go for read-write  
> access, this is quite messy at least FWIAC :(.  
> Hopefully somebody else can give you (us) better information about  
> that particular issue.

Robert

> i guess i could call system() to do it, but tht doesn’t seem right?
> 
> –  
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

–

[http://ruby-smalltalk.blogspot.com/](http://ruby-smalltalk.blogspot.com/)

* * *

All truth passes through three stages. First, it is ridiculed. Second,  
it is violently opposed. Third, it is accepted as being self-evident.  
Schopenhauer (attr.)

---

<div class="post-metadata">

**Author:** ![fox](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/c5a1d2/32.png) [@fox](https://www.ruby-forum.com/u/fox)\
**Post date:** [December 7, 2007, 10:35pm UTC](https://www.ruby-forum.com/t/changing-a-files-content/122070/5 "2007-12-07T22:35:54Z")

</div>

On Dec 4, 3:18 am, Paul F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> end  
> end
> 
> but i’m not sure if that’s efficient? and of course, i’m struggling on  
> the best way of writing those changes back into the file.
> 
> ## any thoughts? thanks, f.
> 
> Posted viahttp://www.ruby-forum.com/.

I did something similar using the rio library. Cleaned up some vb  
files in place

require ‘rio’  
rio(‘C://test’).all.files('_.vb’) do |f|  
rio(f) \<f.contents.gsub(/'UPGRADE._\s/,“”).gsub(/On Error GoTo  
ErrHandler/,“Try”).gsub(/ErrHandler:/,“Catch ex as Exception\n”).gsub(/  
Resume Next/,“End Try”)  
end

---

<div class="post-metadata">

**Author:** ![fox](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/c5a1d2/32.png) [@fox](https://www.ruby-forum.com/u/fox)\
**Post date:** [December 4, 2007, 4:20pm UTC](https://www.ruby-forum.com/t/changing-a-files-content/122070/6 "2007-12-04T16:20:41Z")

</div>

On Dec 4, 3:18 am, Paul F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> end  
> end
> 
> but i’m not sure if that’s efficient? and of course, i’m struggling on  
> the best way of writing those changes back into the file.
> 
> ## any thoughts? thanks, f.
> 
> Posted viahttp://www.ruby-forum.com/.

patterns = { /some\_pattern/ =\> “replacement text” }

File.open(filename, ‘r+’) { | handle |  
out = []  
handle.readlines { | line |  
patterns.each { | pattern, replacement |  
if line.strip =~ pattern  
line = line.gsub(pattern, replacement)  
end  
}  
out \<\< line  
}  
handle.write(out.join(‘’))  
}

Untested…

Regards,  
Jordan
