From: Przemyslaw Daniel Date: 2007-07-12T19:40:56+09:00 Subject: Re: awk regexp search > Note that this basic framework does not support awk's /regex1/,/regex2/ > notation that captures lines between (and including) the lines matching > those regular expressions. > >> Best regards, >> baptiste > --Greg how about something like this simple implementation # AWK in Ruby module AWK class ClassAwk def initialize(filename = "") @NR = 0; # record number @NF = 0; # field number @FS = /\s+/; # field separator @line = ""; # line matched @fields = []; # fields of macthed line @trace = []; # regexp trace if (filename == "") @file = ARGF; else @file = File.open(filename, "r").close;; end end #NOTE: every rule has to be in separate line #to get unique rule id def rule(regexp1, regexp2 = nil) msg = "regexp parameter must be Regexp"; raise ArgumentError, msg unless regexp1.kind_of?(Regexp); if regexp2 == nil if @line =~ regexp1 @fields = @line.split(@FS) yield end else raise ArgumentError, msg unless regexp2.kind_of?(Regexp); rule_id = /.+:([0-9]+)/.match(caller.first.to_s)[1].to_i; @trace[rule_id] = true if @line =~ regexp1; if @trace[rule_id] @fields = @line.split(@FS) yield end @trace[rule_id] = false if @line =~ regexp2; end end def analyze() @NR = 0; ARGF.each { |@line| @line = @line.chop; @NR += 1; yield } end #get paricular field def getField(index) output = ""; if (index == 0) output = @line; else if index - 1 < @fields.length return @fields[index - 1]; end end end #get NR (record number) def getNR return @NR; end #get number of fileds def getNF return @fields.length; end end end and an example how to use it: require "awk.rb" awk = AWK::ClassAwk.new(); awk.analyze() { awk.rule(/start1/, /stop1/) { print "1, NR:", awk.getNR(),", "; print "NF: ", awk.getNF(),", ", awk.getField(0), "\n"; }; awk.rule(/start2/, /stop2/) { print "2, NR:", awk.getNR(),", "; print "NF: ", awk.getNF(),", ", awk.getField(0), "\n"; }; awk.rule(/start1/) { print awk.getField(0); }; } -- Posted via http://www.ruby-forum.com/.