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’
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.
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
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
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.