|
|
 |
 |
 |
 |
Ruby Programming Language
|
 |
 |
 |
 |
 |
 |
 |
 |
search a file and replace text
I need to search a specific xml file in a directory, look for: <port system-property="tangosol.coherence.clusterport">30890</port> and if the port 30890 is still there replace it with a different integer. I know of several ways to do this (like open the file, iterate the lines until I find the integer, do a gsub! on on the integer). But it seems like there might be a better way to do it. Is there a search and replace API I don't know about? Any thoughts?
On 03.04.2007 17:47, phil.swen@gmail.com wrote: > I need to search a specific xml file in a directory, look for: > <port system-property="tangosol.coherence.clusterport">30890</port> > and if the port 30890 is still there replace it with a different > integer. > I know of several ways to do this (like open the file, iterate the > lines until I find the integer, do a gsub! on on the integer). But it > seems like there might be a better way to do it. Is there a search > and replace API I don't know about?
Look for ruby -pi.bak -e 'gsub ...' robert
REXML. http://www.germane-software.com/software/rexml
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.
On 03.04.2007 18:56, phil.swen@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.
Exactly. > How do I actually modify the file itself?
Read it, modify it, write it. Or use ruby -pi.bak ... robert
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.swen@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.
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.swen@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.
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.swen@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.
def ChangeOnFile(file, regex_to_find, text_to_put_in_place) text= File.read file File.open(file, 'w+'){|f| f << text.gsub(regex_to_find, text_to_put_in_place)} end Then: ChangeOnFile('/etc/myfile.conf', /30890/, "32737") Phil Swenson wrote: > I need to search a specific xml file in a directory, look for: > <port system-property="tangosol.coherence.clusterport">30890</port> > and if the port 30890 is still there replace it with a different > integer. > I know of several ways to do this (like open the file, iterate the > lines until I find the integer, do a gsub! on on the integer). But it > seems like there might be a better way to do it. Is there a search > and replace API I don't know about? > Any thoughts?
-- Posted via http://www.ruby-forum.com/.
|
 |
 |
 |
 |
|