# Editing a text file

**URL:** <https://www.ruby-forum.com/t/editing-a-text-file/93138>\
**Category:** Ruby\
**Created:** [April 28, 2007, 2:21am UTC](https://www.ruby-forum.com/t/editing-a-text-file/93138 "2007-04-28T02:21:35Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![barjunk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/3ec8ea/32.png) [@barjunk](https://www.ruby-forum.com/u/barjunk)\
**Post date:** [April 28, 2007, 2:21am UTC](https://www.ruby-forum.com/t/editing-a-text-file/93138/1 "2007-04-28T02:21:35Z")

</div>

There is a task to edit a text file. It is entirely possible that  
multiple people are going to be running the ruby script that edits  
this file at the same time.

I have looked at Ruby cookbook recipe 6.13 and 20.11. These seem like  
what I am wanting.

It seemed like a good idea to float this as a solution before it is  
implemented.

How I do it now is using sed:

flock $USERFILE sed -i   
“/^$1[[:space:]]+/,+6 { s/^\(.\*Default\)/#\1/; s/^#\(.\*SRT\)/  
\1/; }”   
$USERFILE

But I’d like to move this piece of code into the ruby script instead  
of launching it with a system command.

What other ways are people doing this sort of thing?

BTW, for those of you that don’t have the cookbook, it basically  
redefines open to include a flock call.

Mike B.

---

<div class="post-metadata">

**Author:** ![barjunk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/3ec8ea/32.png) [@barjunk](https://www.ruby-forum.com/u/barjunk)\
**Post date:** [April 28, 2007, 2:56pm UTC](https://www.ruby-forum.com/t/editing-a-text-file/93138/2 "2007-04-28T14:56:17Z")

</div>

On 28.04.2007 02:15, barjunk wrote:

> How I do it now is using sed:
> 
> BTW, for those of you that don’t have the cookbook, it basically  
> redefines open to include a flock call.

I consider Ara the definitive source especially when it comes to  
flock’ing NFS mounted files, see for example:

[http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/97211](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/97211)

For the low profile solution check out

[http://ruby-doc.org/core/classes/File.html#M002576](http://ruby-doc.org/core/classes/File.html#M002576)

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![barjunk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/3ec8ea/32.png) [@barjunk](https://www.ruby-forum.com/u/barjunk)\
**Post date:** [April 28, 2007, 8:45pm UTC](https://www.ruby-forum.com/t/editing-a-text-file/93138/3 "2007-04-28T20:45:42Z")

</div>

\> \> robert

Thanks Robert.

So if I’m editing this file, the basic idea here is to do this:

```
 require 'lockfile'

 Lockfile('lock', :retries => 0) do
    # edit my file here
  end

```

And that’s it? I’m assuming this will also work on a non-NFS file  
system as well. That will do just fine.

Mike B.

---

<div class="post-metadata">

**Author:** ![barjunk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/3ec8ea/32.png) [@barjunk](https://www.ruby-forum.com/u/barjunk)\
**Post date:** [April 30, 2007, 11:26am UTC](https://www.ruby-forum.com/t/editing-a-text-file/93138/4 "2007-04-30T11:26:22Z")

</div>

On 28.04.2007 20:44, barjunk wrote:

> > Kind regards  
> > # edit my file here  
> > end
> 
> And that’s it? I’m assuming this will also work on a non-NFS file  
> system as well. That will do just fine.

No, I meant: the basic mechanism uses io.flock, e.g.

11:22:07 [Temp]: cat fl.rb  
#!/usr/bin/ruby

id=ARGV.shift || $$

File.open(“x”, “a”) do |io|  
puts “#{id}: Start #{Time.now}”  
io.flock(File::LOCK\_EX)  
io.puts “#{id}: #{Time.now.inspect}”  
sleep 2  
io.puts “#{id}: #{Time.now.inspect}”  
puts “#{id}: End #{Time.now}”  
end

11:22:12 [Temp]: rm x; for ((i=0;i\<10;++i)) do echo $i; ./fl.rb $i &  
done; sleep 30  
removed `x’  
0  
[1] 272  
1  
[2] 2240  
2  
[3] 3568  
3  
[4] 2644  
4  
0: Start Mon Apr 30 11:22:20 +0200 2007  
[5] 2688  
5  
2: Start Mon Apr 30 11:22:20 +0200 2007  
1: Start Mon Apr 30 11:22:20 +0200 2007  
[6] 2020  
6  
[7] 3472  
7  
3: Start Mon Apr 30 11:22:20 +0200 2007  
[8] 3332  
8  
4: Start Mon Apr 30 11:22:20 +0200 2007  
[9] 3788  
9  
[10] 3456  
5: Start Mon Apr 30 11:22:20 +0200 2007  
6: Start Mon Apr 30 11:22:21 +0200 2007  
7: Start Mon Apr 30 11:22:21 +0200 2007  
8: Start Mon Apr 30 11:22:21 +0200 2007  
9: Start Mon Apr 30 11:22:21 +0200 2007  
0: End Mon Apr 30 11:22:22 +0200 2007  
2: End Mon Apr 30 11:22:24 +0200 2007  
1: End Mon Apr 30 11:22:26 +0200 2007  
3: End Mon Apr 30 11:22:28 +0200 2007  
4: End Mon Apr 30 11:22:30 +0200 2007  
5: End Mon Apr 30 11:22:32 +0200 2007  
6: End Mon Apr 30 11:22:34 +0200 2007  
7: End Mon Apr 30 11:22:36 +0200 2007  
8: End Mon Apr 30 11:22:38 +0200 2007  
9: End Mon Apr 30 11:22:40 +0200 2007  
[1] Done ./fl.rb $i  
[2] Done ./fl.rb $i  
[3] Done ./fl.rb $i  
[4] Done ./fl.rb $i  
[5] Done ./fl.rb $i  
[6] Done ./fl.rb $i  
[7] Done ./fl.rb $i  
[8] Done ./fl.rb $i  
[9]- Done ./fl.rb $i  
[10]+ Done ./fl.rb $i  
11:22:51 [Temp]:

From the timings you can nicely see that exclusive locking works.

robert
