# Help with Writing Replacement Text to Files

**URL:** <https://www.ruby-forum.com/t/help-with-writing-replacement-text-to-files/129391>\
**Category:** Ruby\
**Created:** [February 18, 2008, 5:02am UTC](https://www.ruby-forum.com/t/help-with-writing-replacement-text-to-files/129391 "2008-02-18T05:02:24Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![thomasptacek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a9a28c/32.png) [@thomasptacek](https://www.ruby-forum.com/u/thomasptacek)\
**Post date:** [February 18, 2008, 5:02am UTC](https://www.ruby-forum.com/t/help-with-writing-replacement-text-to-files/129391/1 "2008-02-18T05:02:24Z")

</div>

Hello!

I’m new to ruby and been reading this very active list for about a  
couple of week.

I have a project at work where I need to write a simple script to  
scrub IP addresses from configuration files for classified networks we  
work in sometimes. The goal is to cleanse configuration files  
sometimes required for support of any specific network addressing  
information. Here is what I’ve come up with so far. While this works  
in IRB on the file object I create, I cannot figure out how to write  
the changes back in place to the actual file itself back on the regex  
I’m using:

config\_file = File.open(“config.txt”)  
config\_txt = config\_file.read  
config\_txt.gsub!(/\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/,  
“000.000.000.000”)

I do understand that the default action here is read-only. How to do I  
parse with the regex on the current file and replace matching strings  
without either appending to the file, overwriting the file, or  
creating a new file?

Thanks!

~Thomas

---

<div class="post-metadata">

**Author:** ![thomasptacek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a9a28c/32.png) [@thomasptacek](https://www.ruby-forum.com/u/thomasptacek)\
**Post date:** [February 18, 2008, 5:32am UTC](https://www.ruby-forum.com/t/help-with-writing-replacement-text-to-files/129391/2 "2008-02-18T05:32:53Z")

</div>

Try this:

File.open(“config.txt”, “rw”) do |f|  
text = f.read  
text.gsub!(/\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/, “000.000.000.000”)  
f.rewind  
f.write(text)  
end

Using the block form like that will automagically close the file when  
it ends. 🙂

–Jeremy

On Feb 17, 2008 11:00 PM, Thomas P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> in IRB on the file object I create, I cannot figure out how to write  
> without either appending to the file, overwriting the file, or  
> creating a new file?
> 
> Thanks!
> 
> ~Thomas

–  
[http://jeremymcanally.com/](http://jeremymcanally.com/)  
[http://entp.com](http://entp.com)

Read my books:  
Ruby in Practice ([Ruby in Practice](http://manning.com/mcanally/))  
My free Ruby e-book ([http://humblelittlerubybook.com/](http://humblelittlerubybook.com/))

Or, my blogs:

> **[Site not found · DreamHost](http://mrneighborly.com)**
>
> The owner of this domain has not yet uploaded their website.

[http://rubyinpractice.com](http://rubyinpractice.com)

---

<div class="post-metadata">

**Author:** ![thomasptacek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a9a28c/32.png) [@thomasptacek](https://www.ruby-forum.com/u/thomasptacek)\
**Post date:** [February 18, 2008, 5:38am UTC](https://www.ruby-forum.com/t/help-with-writing-replacement-text-to-files/129391/3 "2008-02-18T05:38:45Z")

</div>

Thomas,

I’m new to Ruby (only a few days) but this is something I think I can  
actually help you with. I had to do some searching and I came across  
this website …  
[http://pleac.sourceforge.net/pleac\_ruby/fileaccess.html](http://pleac.sourceforge.net/pleac_ruby/fileaccess.html)

Search for ‘Modifying a File in Place Without a Temporary File’ and  
you’ll find the code. I’ll paste it here though just to make it quick  
and easy …

File.open(‘itest’, ‘r+’) do |f| # open file for update  
lines = f.readlines # read into array of lines  
lines.each do |it| # modify lines  
it.gsub!(/foo/, ‘QQQ’)  
end  
f.pos = 0 # back to start  
f.print lines # write out modified lines  
f.truncate(f.pos) # truncate to new length  
end # file is automatically closed

r+ is the mode that allows you to read and write to the file. I made  
a text file named itest with this for content …

foo foo  
bar bar  
foo foo

I ran that code and the file got changed to …

QQQ QQQ  
bar bar  
QQQ QQQ

That’s what you’re looking for isn’t it? I would suggest making a  
backup of the files just in case there is a problem. If that isn’t  
what you were looking for I apologize, reply back to this and I’ll try  
again haha.

–  
-Andy  
“I have a great faith in fools; self-confidence my friends call it.” –  
Edgar Allen Poe

---

<div class="post-metadata">

**Author:** ![thomasptacek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a9a28c/32.png) [@thomasptacek](https://www.ruby-forum.com/u/thomasptacek)\
**Post date:** [February 18, 2008, 7:53am UTC](https://www.ruby-forum.com/t/help-with-writing-replacement-text-to-files/129391/4 "2008-02-18T07:53:43Z")

</div>

Jeremy McAnally wrote:

> Try this:
> 
> File.open(“config.txt”, “rw”) do |f|

File.open(‘data.text’, ‘rw’) do |f|  
end

–output:–  
r1test.rb:1:in `initialize': illegal access mode rw (ArgumentError) from r1test.rb:1:in`open’  
from r1test.rb:1

---

<div class="post-metadata">

**Author:** ![thomasptacek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a9a28c/32.png) [@thomasptacek](https://www.ruby-forum.com/u/thomasptacek)\
**Post date:** [February 18, 2008, 3:36pm UTC](https://www.ruby-forum.com/t/help-with-writing-replacement-text-to-files/129391/5 "2008-02-18T15:36:36Z")

</div>

Andy/Jeremy

Thanks for the help!

Jeremy, I ran your code snippet first with “w+” and it wiped the whole  
file. I then ran the code snippet Andy provided and it worked. I went  
back and used “r+” instead of “w+” in the code you provided Jeremy and  
it worked as well.

I also appreciate the explanatory comments. Very helpful.

Both code snippets work and provide me with exactly what I need.

Thanks again.

Hopefully as I move along I’ll be able to be just as helpful on this  
list.

Best Regards,

~Thomas

---

<div class="post-metadata">

**Author:** ![thomasptacek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a9a28c/32.png) [@thomasptacek](https://www.ruby-forum.com/u/thomasptacek)\
**Post date:** [February 18, 2008, 8:02am UTC](https://www.ruby-forum.com/t/help-with-writing-replacement-text-to-files/129391/6 "2008-02-18T08:02:21Z")

</div>

Oops. Try “w+” instead.

_has Python/PHP file read modes on the brain_

–Jeremy

On Feb 18, 2008 1:55 AM, 7stud – [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ## r1test.rb:1:in `initialize': illegal access mode rw (ArgumentError) from r1test.rb:1:in `open’ from r1test.rb:1
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

–  
[http://jeremymcanally.com/](http://jeremymcanally.com/)  
[http://entp.com](http://entp.com)

Read my books:  
Ruby in Practice ([Ruby in Practice](http://manning.com/mcanally/))  
My free Ruby e-book ([http://humblelittlerubybook.com/](http://humblelittlerubybook.com/))

Or, my blogs:

> **[Site not found · DreamHost](http://mrneighborly.com)**
>
> The owner of this domain has not yet uploaded their website.

[http://rubyinpractice.com](http://rubyinpractice.com)

---

<div class="post-metadata">

**Author:** ![thomasptacek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a9a28c/32.png) [@thomasptacek](https://www.ruby-forum.com/u/thomasptacek)\
**Post date:** [February 18, 2008, 4:37pm UTC](https://www.ruby-forum.com/t/help-with-writing-replacement-text-to-files/129391/7 "2008-02-18T16:37:22Z")

</div>

Oh, right. I forget that the “\*+” modes do the primary letter (“w”  
wipes the file for example) first, then “add on” the functionality of  
the other (this must show how much I actually use those modes, eh?  
:)). Well, glad to help nonetheless.

–Jeremy

On Feb 18, 2008 9:35 AM, Thomas P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > ## f.print lines # write out modified lines I ran that code and the file got changed to …
> > 
> > > config\_file = File.open(“config.txt”)  
> > > Thanks!
> > > 
> > > ~Thomas

–  
[http://jeremymcanally.com/](http://jeremymcanally.com/)  
[http://entp.com](http://entp.com)

Read my books:  
Ruby in Practice ([Ruby in Practice](http://manning.com/mcanally/))  
My free Ruby e-book ([http://humblelittlerubybook.com/](http://humblelittlerubybook.com/))

Or, my blogs:

> **[Site not found · DreamHost](http://mrneighborly.com)**
>
> The owner of this domain has not yet uploaded their website.

[http://rubyinpractice.com](http://rubyinpractice.com)
