Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.ruby > #4800
| From | Brian Candler <b.candler@pobox.com> |
|---|---|
| Newsgroups | comp.lang.ruby |
| Subject | Re: replace lines in a file using hash key-value pairs |
| Date | 2011-05-20 03:03 -0500 |
| Organization | Service de news de lacave.net |
| Message-ID | <defad00796360dd75ca6a6d339634d77@ruby-forum.com> (permalink) |
| References | <235a8d6f428573541046a02f84b60764@ruby-forum.com> |
Johan Martinez wrote in post #999809:
> configfile = File.open("#{configfilename}","r+")
>
> # read filelocations hash - for each key, replace with value
> depprops.get_filelocations.each_pair do
> |key,value|
> puts " #{key} #{value}"
> configfile.each do
> |line|
> puts line
> # puts line if line.match("#{key}")
> # line.sub!("/#{key}/","#{key} = #{value}")
> end
> end
These are nested loops. For the first key,value pair iteration,
configfile.each goes through each of the lines. After that the file is
exhausted, and .each won't do anything more. If you want to do that, you
have to either .rewind or open the file again:
depprops.get_filelocations.each_pair do |key,value|
File.open(configfilename) do |configfile|
configfile.each_line do |line|
...
end
end
end
Using the block form of File.open ensures that it's closed after each
iteration.
Of course, this is probably a very inefficient way to do what you want;
I'd rather iterate through the file once, and for each line do the
key/value substitutions. But then you get the results in a different
order, of course.
> Also, is there any other way to implement search search-replace for all
> matching lines in a files based on hash/yaml file.
Probably the most efficient way is to build a single regex that matches
all the substitutions in one go.
subs = {"hello"=>"goodbye", "world"=>"cruel life"}
keys = subs.keys.map { |k| Regexp.escape(k.to_s) }
pattern = Regexp.new("(?:#{keys.join("|")})")
lines = "hello world\ntesting\nhello again hello\n"
lines.each_line do |line|
puts line.gsub(pattern) { |k| subs[k] }
end
--
Posted via http://www.ruby-forum.com/.
Back to comp.lang.ruby | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
replace lines in a file using hash key-value pairs Johan Martinez <jmartiee@gmail.com> - 2011-05-20 02:12 -0500 Re: replace lines in a file using hash key-value pairs Johannes Held <johannes.held@informatik.uni-erlangen.de> - 2011-05-20 09:37 +0200 Re: replace lines in a file using hash key-value pairs Brian Candler <b.candler@pobox.com> - 2011-05-20 03:03 -0500 Re: replace lines in a file using hash key-value pairs Johan Martinez <jmartiee@gmail.com> - 2011-05-21 22:07 -0500
csiph-web