Searching Strings

sed, the “stream editor,” provides a flexible search-and-replace facility, which can be used to replace text. For example, you can upgrade your datacenter in one fell swoop by replacing Wintel with Linux:

sed s/Wintel/Linux/g datacenter

sed is extremely powerful, but the basic search-and-replace functionality is also a feature of bash. Spawning additional processes takes time, which is exacerbated in a loop that runs 10, 100, or 1,000 times. Because sed is a relatively large program to fire up just to do some simple text replacement, using the builtin bash functionality is a lot more efficient.

The syntax is not too dissimilar from the sed syntax. Where $datacenter is the variable, and the mission is — again — replacing Wintel with Linux, the sed from the previous line of code would be equivalent to:

echo ${datacenter/Wintel/Linux}

Using Search and Replace

Consider a line in /etc/passwd for a user called Fred. This syntax can be used to change the pattern fred to wilma.

user='grep fred /etc/passwd'echo $user
fred:x:1000:1000:Fred Flintstone:/home/fred:/bin/bash
$ echo ${user/fred/wilma}
wilma:x:1000:1000:Fred Flintstone:/home/fred:/bin/bash

This has only changed the first instance of the word fred. To change all instances of fred to wilma, change the first / to a double // (or, as the documentation explains it, add an extra slash to the beginning of the search string). This replaces every instance of the search pattern with the new text.

Get Shell Scripting: Expert Recipes for Linux, Bash, and More now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.