From: Robert Klemme Date: 2009-12-02T19:30:10+09:00 Subject: Re: Searching Text for Multiple Matches 2009/11/30 jackster the jackle : > Thanks Roger. I am currently iterating through each line of text and > matching on any lines that either have "IP Address" or "Default Gateway" > in them and grabbing the IP addresses and assigning them to variables. > > The problem is, the first IP address I get seems to disapear toward the > end of the script and I can't figure out why....perhaps because I'm > using "elsif"? > > here is the code: > > ipconf = `ipconfig` > > ipconf.each do |x| > >     if >     x[/IP\sAdd*/] >     x.scan(/\s*IP\sAddress.*\:\s([1-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s+$/) >     ip = $1 >     puts "ip addr: " + $1.to_s   ## THIS PRINTS OUT FINE > > >     elsif >     x[/Def*/] >     puts "XXXXX IP: #{ip}" >     x.scan(/\s*Default\sGateway.*\:\s([1-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s+$/) >     def_gate = $1 >     puts "Default Gateway: "+$1.to_s   ## THIS PRINTS OUT FINE > > >     puts "Print IP address again: #{ip_addr}"  ### THIS HAS NO VALUE > >  end > end > > I think I need to somehow combine the "if" and "elsif" statements so I'm > not using "or" and this way the ip_addr variable will hold it's value? I would attempt a two stage approach: 1. stage: match a complete adapter description 2. stage: match individual portions of it str = <<'XXX' Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : corp.pc.com IP Address. . . . . . . . . . . . : 172.1.81.7 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.1.81.254 Ethernet adapter Network Connect Adapter: Media State . . . . . . . . . . . : Media disconnected Ethernet adapter Wireless Network Connection: Connection-specific DNS Suffix . : corp.pc.com IP Address. . . . . . . . . . . . : 172.1.17.116 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.1.17.254 XXX str.scan %r{ ^ \S [^:]* : \s* $ (?: ^ \s+ [^:]+ : [^:]+ $ [\n\r]+ )* }x do |adapter| # p adapter name = adapter[%r{Ethernet\s+adapter\s+(\S[^:]*):}, 1] addr = adapter[%r{IP Address[^:]*:\s*(\d+(?:\.\d+){3})}, 1] printf "%p %p\n", name, addr end Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/