fbpx

Server Setup

Sed? Long live “replace”!

by , , revisited on


We have by far the largest RPM repository with NGINX module packages and VMODs for Varnish. If you want to install NGINX, Varnish, and lots of useful performance/security software with smooth yum upgrades for production use, this is the repository for you.
Active subscription is required.

Users of various MySQL distributions know and love the replace command-line utility that is shipped with MySQL servers. It allows us to quickly replace a string within files.

For example, to replace string foo with bar within file.txt, you would run:

replace foo bar -- file.txt

Surely, you can do this with sed:

sed -i 's@foo@bar@g' file.txt

But for various reasons, and namely the syntax, many users want something simple like replace for the task.

The replace is most useful when you need to make multiple replacements. Simply specify multiple replacement pairs like this:

replace foo bar aaa bbb ccc ddd -- file.txt

This would replace aaa with bbb, ccc with ddd in addition to foo -> bar replacement.

Deprecation of replace utility

Some MySQL distributions now issue a warning when running the replace utility, e.g.:

Warning: replace is deprecated and will be removed in a future version.

Fear not, there is an alternative. And it’s not sed.

replace2

There is another utility for the job that is named the same (replace) and it’s authored by Richard K. Lloyd.

You can get the utility for CentOS/RHEL with a couple of commands:

yum install https://extras.getpagespeed.com/release-latest.rpm
yum install replace2

The program uses quite a different syntax to that of MySQL’s replace, but it’s still easier than using bare sed for the job. To remove confusion with replace, it is packaged as replace2.

To make our foo -> bar replacement, we can now run:

replace2 foo bar file.txt

And for multiple replacement pairs, put them in extra -a switches:

replace2 foo bar -a aaa bbb -a ccc ddd file.txt

The important gotcha here is that the replace2 is case insensitive by default. To make it case sensitive, use -e switch:

replace2 -e foo bar -a aaa bbb -a ccc ddd file.txt

It would be interesting to write an “alias-like” program that would be able to invoke replace2 with the same syntax and case sensitivity as its MySQL counterpart.

… and back to replace

The original MySQL version of replace utility now can be installed separately! I have built a separate package for it.

So anyone who’s missing good old replace with the same syntax as before can install it. If you already upgraded to MySQL 8.0 which lacks replace, or simply want to run replace on a server without MySQL installed, now you can:

yum install https://extras.getpagespeed.com/release-latest.rpm
yum install replace

… And rock and roll! Proceed with replacing stuff as usual 🙂

  1. Todd Hodes

    any idea if we could build it for mac?

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

This site uses Akismet to reduce spam. Learn how your comment data is processed.