Data stream variables

A

Alain Helfenstein

Hi

I want to print all lines wihtch contains the string "Open" from a bunch
of 'xml' files. Additionally I want to print the filename and the line
number of the match.

The problem with the following snippet is, that the variable '$.' does
not reset the line number at the beginning of a new file.

That menas, the printed file numbers are not correct except for the
first file of '*.xml'

ruby -n -e 'puts ($FILENAME + " " + $..to_s + "" + $_) if /Open/' *.xml

Does anybody have a idea, on how to print the correct line number?

Thanks a lot for your answer, Alain.
 
A

Andrew Timberlake

[Note: parts of this message were removed to make it a legal post.]

Hi

I want to print all lines wihtch contains the string "Open" from a bunch
of 'xml' files. Additionally I want to print the filename and the line
number of the match.

The problem with the following snippet is, that the variable '$.' does
not reset the line number at the beginning of a new file.

That menas, the printed file numbers are not correct except for the
first file of '*.xml'

ruby -n -e 'puts ($FILENAME + " " + $..to_s + "" + $_) if /Open/' *.xml

Does anybody have a idea, on how to print the correct line number?

Thanks a lot for your answer, Alain.
Does it all have to be done in ruby?
Why not
ls *.xml | xargs ruby -n -e 'puts ($FILENAME + " " + $..to_s + "" + $_) if
/Open/'

--
Andrew Timberlake
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain
 
A

Alain Helfenstein

Andrew said:
On Mon, Jan 12, 2009 at 3:21 PM, Alain Helfenstein
<[email protected]

Does it all have to be done in ruby?
Why not
ls *.xml | xargs ruby -n -e 'puts ($FILENAME + " " + $..to_s + "" + $_)
if
/Open/'

--
Andrew Timberlake
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain

Thanks a lot for your answer.

Sadly I'm running Windows XP.

But I try to get GnuWin32 running...

Alain
 
A

Andrew Timberlake

[Note: parts of this message were removed to make it a legal post.]

Thanks a lot for your answer.

Sadly I'm running Windows XP.

But I try to get GnuWin32 running...

Alain
Alain

Sorry, I made a mistake with my answer above. Instead of using xargs (which
was exactly the same as your method - actually)
Use find to make sure ruby gets a unique file each time:
find *.xml -exec ruby -n -e 'puts ($FILENAME + " " + $..to_s + "" + $_) if
/Open/' {} \;
--still doesn't help on Windows though

Instead of trying to do this in a one-liner, save the following as a file:
ARGV.each do |filename|
File.open(File.join(File.dirname(__FILE__), filename)) do |file|
while line = file.gets
puts (filename + " " + $..to_s + "" + $_) if line =~ /Open/
end
end
end

And then run:
ruby <filename> *.xml

Hopefully that helps

--
Andrew Timberlake
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain
 
R

Robert Klemme

I want to print all lines wihtch contains the string "Open" from a bunch
of 'xml' files. Additionally I want to print the filename and the line
number of the match.

The problem with the following snippet is, that the variable '$.' does
not reset the line number at the beginning of a new file.

That menas, the printed file numbers are not correct except for the
first file of '*.xml'

ruby -n -e 'puts ($FILENAME + " " + $..to_s + "" + $_) if /Open/' *.xml

Does anybody have a idea, on how to print the correct line number?

Thanks a lot for your answer, Alain.

I'm not Alain, but... :) Just kidding.

Here's how to do it:

ruby -ne 'puts "#$FILENAME #$. #$_" if /Open/; $.=0 if ARGF.eof?' *.xml

Cheers

robert
 
A

Andrew Timberlake

[Note: parts of this message were removed to make it a legal post.]

I'm not Alain, but... :) Just kidding.

Here's how to do it:

ruby -ne 'puts "#$FILENAME #$. #$_" if /Open/; $.=0 if ARGF.eof?' *.xml

Cheers

robert
I was wondering if you could reset the line counter but didn't think of just
setting $. = 0
Sometimes ruby is just too easy :) I still sometimes think things need to
be more complicated.

--
Andrew Timberlake
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain
 
R

Robert Klemme

[Note: parts of this message were removed to make it a legal post.]

I'm not Alain, but... :) Just kidding.

Here's how to do it:

ruby -ne 'puts "#$FILENAME #$. #$_" if /Open/; $.=0 if ARGF.eof?' *.xml
I was wondering if you could reset the line counter but didn't think of just
setting $. = 0

IMHO the tricky bit is to know *when* to reset, i.e. to know that
ARGF#eof? signals the end of a single file and not all files. :)
Sometimes ruby is just too easy :) I still sometimes think things need to
be more complicated.

:) The other area where I simplified your piece of code is the string
handling. Btw, when String interpolation (i.e. #$GLOBAL or #{expr}) you
do not need the explicit to_s.

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,776
Messages
2,569,603
Members
45,192
Latest member
KalaReid2

Latest Threads

Top