Home > string_replacer

string_replacer

String_replacer is a project mainly written in Ruby, based on the MIT license.

DEPRECATED/POINTLESS - use sed or augeas. Replace text in a file without disturbing the rest of the file.

= string_replacer

Repeatedly replace text in a file without disturbing the rest of the file.

== Use

$ string_replacer PATH STRING [REPLACEMENT_ID] [AFTER_LINE]

For example:

$ echo "hello" > test.txt $ cat test.txt hello $ string_replacer test.txt "Don't forget to say "hello world"" "Just a reminder" $ cat test.txt hello

START StringReplacer Just a reminder -- DO NOT MODIFY

Don't forget to say "hello world"

END StringReplacer Just a reminder -- DO NOT MODIFY

Now I swap it out by using the same REPLACEMENT_ID...

$ string_replacer test.txt "YOU ARE STILL FORGETTING to say "hello world"" "Just a reminder" $ cat test.txt hello

START StringReplacer Just a reminder -- DO NOT MODIFY

YOU ARE STILL FORGETTING to say "hello world"

END StringReplacer Just a reminder -- DO NOT MODIFY

And finally, to demonstrate that REPLACEMENT_ID is case-sensitive...

$ string_replacer test.txt "Nevermind" "Just a Reminder" $ cat test.txt hello

START StringReplacer Just a reminder -- DO NOT MODIFY

YOU ARE STILL FORGETTING to say "hello world"

END StringReplacer Just a reminder -- DO NOT MODIFY

START StringReplacer Just a Reminder -- DO NOT MODIFY

Nevermind

END StringReplacer Just a Reminder -- DO NOT MODIFY

If you don't specify REPLACEMENT_ID, it will default to "1."

== Real-world usage

http://brighterplanet.com uses it to unmask the memcached 1.4.4 package on http://engineyard.com AppCloud (i.e. Amazon EC2) instances.

We have this in our before_restart.rb hook:

###############################################################

make sure we have string_replacer installed at the system level

############################################################### sudo 'gem install string_replacer --no-rdoc --no-ri'

###############################################################

install memcached 1.4.4, which is not available by default

############################################################### memcached_server_version = '1.4.4' unless /usr/bin/memcached -h.include?(memcached_server_version) sudo "/usr/bin/string_replacer /etc/portage/package.keywords/local "=net-misc/memcached-#{memcached_server_version}" "make sure memcached #{memcached_server_version} is available"" sudo "emerge net-misc/memcached" end sudo "cp #{release_path}/deploy/memcached/memcached.#{node[:environment][:name]} /etc/conf.d/memcached"

Before:

$ cat /etc/portage/package.keywords/local =dev-lang/ruby-1.8.7_p174

After:

$ cat /etc/portage/package.keywords/local =dev-lang/ruby-1.8.7_p174

START StringReplacer make sure memcached 1.4.4 is available -- DO NOT MODIFY

=net-misc/memcached-1.4.4

END StringReplacer make sure memcached 1.4.4 is available -- DO NOT MODIFY

== Obvious flaws

  • assumes whitespace is ignored
  • assumes # means comment
  • no idea how it would work on big files
  • there is probably a unix program that has done this since the 1970s

== Copyright

Copyright (c) 2010 Seamus Abshere. See LICENSE for details.

Previous:href_anywhere