# File.open with line =~ /.../

**URL:** <https://www.ruby-forum.com/t/file-open-with-line/86561>\
**Category:** Ruby\
**Created:** [February 23, 2007, 8:36am UTC](https://www.ruby-forum.com/t/file-open-with-line/86561 "2007-02-23T08:36:44Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 23, 2007, 8:36am UTC](https://www.ruby-forum.com/t/file-open-with-line/86561/1 "2007-02-23T08:36:44Z")

</div>

Hi,

i have a txtfile like that =

bla1  
foo=red

bla2  
foo=green

bla3  
foo=yellow

and i want to get i.e. bla1 and the corresponding value of foo

i tried with

File.open(“Y:/test/sample.txt”, “r”).each do |line|  
puts $1\<\<’ : '\<\< $3 if line =~ /(\w+)\s+(\w+=)(\w+)/  
end

but somehow the regex doesn’t work ?!  
whereas it works in the QuickRex Plugin for Eclipse

Any ideas ?

Regards, Gilbert

---

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 23, 2007, 9:16am UTC](https://www.ruby-forum.com/t/file-open-with-line/86561/2 "2007-02-23T09:16:50Z")

</div>

On 23.02.2007 08:36, Rebhan, Gilbert wrote:

> bla3  
> but somehow the regex doesn’t work ?!  
> whereas it works in the QuickRex Plugin for Eclipse
> 
> Any ideas ?

If this is really the case I’d say the QuickRex Plugin is broken or you  
feed different files. Since you match for a non zero number of white  
space characters before the equal sign, it should not match, since there  
is none in the file contents you showed. You could change to \s\* or  
leave it out completely.

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 23, 2007, 10:00am UTC](https://www.ruby-forum.com/t/file-open-with-line/86561/3 "2007-02-23T10:00:54Z")

</div>

Hi,

---

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 23, 2007, 11:22am UTC](https://www.ruby-forum.com/t/file-open-with-line/86561/4 "2007-02-23T11:22:13Z")

</div>

Hi,

---

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 23, 2007, 10:47am UTC](https://www.ruby-forum.com/t/file-open-with-line/86561/5 "2007-02-23T10:47:06Z")

</div>

Rebhan, Gilbert wrote:

> bla3  
> but somehow the regex doesn’t work ?!  
> whereas it works in the QuickRex Plugin for Eclipse

Well… for each line of the file you are trying to match 2 lines.  
That’s impossible :). Read the file in “paragraph mode” and match each  
paragraph, or read it whole and scan it for your regexp.

For example (not tested):

File.read(’…’).scan(/^(\w+)\s\*\n\w+=(\w+)$/) {|a,b| puts a+": "+b}

Good luck.

---

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 23, 2007, 12:02pm UTC](https://www.ruby-forum.com/t/file-open-with-line/86561/6 "2007-02-23T12:02:23Z")

</div>

On Fri, Feb 23, 2007 at 04:36:05PM +0900, Rebhan, Gilbert wrote:

> but somehow the regex doesn’t work ?!  
> whereas it works in the QuickRex Plugin for Eclipse
> 
> Any ideas ?

It’s because you’re only searching within each line individually,  
whereas  
your regexp matches ( word, space, word=word ) in one go. Using ‘each’  
it  
will be invoked first with “bla1\n” and then with “foo=red\n”, neither  
of  
which matches by itself.

If it’s a small file then just slurp it in all in one go:

ans = File.open(“sample.txt”).read.scan(/(\w+)\s+(\w+=)(\w+)/)  
p ans

Your regexp works, but personally I would add some anchors, i.e.

ans = File.open(“sample.txt”).read.scan(/^(\w+)\s+(\w+=)(\w+)$/)  
p ans

If you want to avoid reading the whole file in, there are more complex  
solutions, e.g.

require ‘enumerator’  
ans = File.open(“sample.txt”).each\_cons(2) do |line1, line2|  
next unless line1 =~ /^(\w+)$/  
cat = $1  
next unless line2 =~ /^(\w+)=(\w+)$/  
puts “#{cat}: #{$1} =\> #{$2}”  
end

HTH,

Brian.

---

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 23, 2007, 2:40pm UTC](https://www.ruby-forum.com/t/file-open-with-line/86561/7 "2007-02-23T14:40:42Z")

</div>

On 23.02.2007 09:59, Rebhan, Gilbert wrote:

> > Hi,  
> > foo=yellow  
> > whereas it works in the QuickRex Plugin for Eclipse  
> > \*/  
> > the regex  
> > (\w+)\r\n(\w+=)(\w+) works in all implementations except the Awk  
> > also the regex (\w+)\s+(\w+=)(\w+) works for all except the Awk  
> > implementation
> 
> so i get = $1 \> bla1 $2 \>foo $3 \> red with both regex
> 
> Did only simple regex operations on one line in ruby until now.  
> What’s wrong with my regex ?

Maybe I was too fast - I overlooked that you are trying to match  
multiple lines. In that case of course you have to feed multiple lines

- not a single line at a time as Carlos pointed out.

Kind regards

robert
