From: Przemyslaw Daniel Date: 2007-07-17T00:21:25+09:00 Subject: Re: awk regexp search small update to make it easier # AWK implementation module AWK class ClassAwk def initialize(filename = "") @NR = 0; # record number @NF = 0; # field number @FS = /\s+/; # field separator @f = []; # fields of macthed line, f[0] - line @trace = []; # regexp trace #input file @file = filename == "" ? ARGF: File.open(filename, "r"); 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 yield if @f[0] =~ regexp1; 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 @f[0] =~ regexp1; yield if @trace[rule_id] @trace[rule_id] = false if @f[0] =~ regexp2; end end def analyze() @NR = 0; @file.each { |line| @NR += 1; @f = line.split(@FS) @NF = @f.length @f.unshift(line.chop); yield } end attr_reader :NR, :NF, :f; end end example: require "awk.rb" awk = AWK::ClassAwk.new(); awk.analyze() { awk.rule(/start1/, /stop1/) { print "1, NR:#{awk.NR}, NF:#{awk.NF}, #{awk.f[0]}\n"; }; awk.rule(/start2/, /stop2/) { print "2, NR:#{awk.NR}, NF:#{awk.NF}, #{awk.f[0]}\n"; }; awk.rule(/start1/) { print "3, NR:#{awk.NR}, NF:#{awk.NF}, #{awk.f[0]}\n"; }; } -- Posted via http://www.ruby-forum.com/.