# 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.