The First Cry of Atom Today is the first day of the rest of my life.

Replace string in command line

In daily development and operation, there are some times to replace string with command line. For example,

$ cat hostlist.txt
serviceA.foo.example.com
serviceB.foo.example.com
serviceC.foo.example.com
serviceD.foo.example.com
serviceE.foo.example.com
serviceF.foo.example.com
serviceG.foo.example.com
serviceH.foo.example.com

These hostlist files usually used by command line tools such as fabric. When you want to deploy other service in example.com, how can we do that? There are command line tools which is very useful and simple for replacing some string.

tr

tr command translates characters. You can replace each one character.

$ cat hostlist.txt | tr "f" "b"
serviceA.boo.example.com
serviceB.boo.example.com
serviceC.boo.example.com
serviceD.boo.example.com
serviceE.boo.example.com
serviceF.boo.example.com
serviceG.boo.example.com
serviceH.boo.example.com

However it seems hard to replace one string not only one character. I think this is the case we usually face. So sed exists.

sed

sed command replace one string, the sequence of character. You can replace foo service to bar service only one command.

$ cat hostlist.txt | sed s/foo/bar/
serviceA.bar.example.com
serviceB.bar.example.com
serviceC.bar.example.com
serviceD.bar.example.com
serviceE.bar.example.com
serviceF.bar.example.com
serviceG.bar.example.com
serviceH.bar.example.com

And also you can use regular expression with sed command.

$ cat hostlist.txt | sed "s/^service[A-Z]/&-&/"
serviceA-serviceA.foo.example.com
serviceB-serviceB.foo.example.com
serviceC-serviceC.foo.example.com
serviceD-serviceD.foo.example.com
serviceE-serviceE.foo.example.com
serviceF-serviceF.foo.example.com
serviceG-serviceG.foo.example.com
serviceH-serviceH.foo.example.com

We can use matched string in later place as you like. This is powerful tool for daily operation. Thank you.