From: Robert Evans Date: 2007-04-05T04:49:48+09:00 Subject: Re: search a file and replace text And note, this won't erase any left over old file contents that extend beyond the length of the current file, e.g., if the port number is a shorter number of characters than the old port number. Bob On Apr 4, 2007, at 12:44 PM, Robert Evans wrote: > Actually, that was pretty sloppy, by opening the file in read-write > mode, and then rewinding after the read, we can overwrite it with > the changes in a one-liner: > > File.open("/tmp/replaceable.txt", 'r+') { |f| newstr = f.read.gsub > ('33333', '00000'); f.rewind; f.puts(newstr) } > > Bob > > > On Apr 4, 2007, at 12:39 PM, Robert Evans wrote: > >> gsub! is destructive - it edits in-place and does not return a >> value. You could get a value back from gsub, but then you'd need >> to do something with that value. >> >> The following worked, though I don't consider it elegant: >> >> require 'fileutils' >> >> File.open("/tmp/replaceable2.txt", 'w+') do | new_file | >> new_file.puts(File.open('/tmp/replaceable.txt', 'r') do | >> original_file | >> original_file.read.gsub('30890', >> '44444') >> end) >> end >> FileUtils.mv("/tmp/replaceable2.txt", "/tmp/replaceable.txt") >> >> If you don't want the intermediate file, you could do something >> like this: >> >> new_str = File.open('/tmp/replaceable.txt', 'r') { | f | >> f.read.gsub('30890', '44444') } >> File.open('/tmp/replaceable.txt', w+) { |f| f.puts new_str } >> >> Bob >> http://www.junitfactory.com/ >> >> >> >> On Apr 3, 2007, at 10:00 AM, phil.swenson@gmail.com wrote: >> >>> well I *THOUGHT* I knew how to do it, here's my first crack at it: >>> >>> file_name = base_config_path + '/Caching/tangosol- >>> coherence.xml' >>> File.open(file_name, File::RDWR).each{ |line| >>> if line.gsub!(/30890/, port.to_s) >>> puts "tangosol port overridden with %d" % port >>> break >>> end >>> } >>> >>> >>> The gsub doesn't modify the line, guess it just modifies the string. >>> How do I actually modify the file itself? >>> >>> btw, I did look at rexml but it looked like overkill for this. I'll >>> take another look though. >>> >>> >> >> > >