I recently needed to search and replace some text in a large number of PHP scripts. Back in my Windows days I had a lightweight freeware programme that was perfect for the job. But what to do on Linux? The answer was to combine
sed. But don’t forget to watch out for Git!
grep And sed
grep is a command-line utility for searching plain-text data sets for lines matching a regular expression.
sed (stream editor) is a command-line utility that parses and transforms text. Put the two together by piping the output from
sed and you’ve got a command-line search and replace tool!
How To Search And Replace
The intricacies of
sed are beyond the scope this post. Suffice it to say, the snippet below will do the searching and replacing for you:
grep -rl matchstring | xargs sed -i 's/matchstring/replacestring/g'
Don’t Get Caught By Git!
In my haste to update my PHP files I neglected to notice that as well as matching my scripts,
grep had also matched a Git index file
.git/index. So when I ran piped the result to
sed, the Git index was updated and it broke my repository! No
git status or any of the familiar Git commands would work.
Exclude The Git Directory
When running your
grep command it is possible (in modern versions >= 2.5.2) to use the
--exclude-dir='pattern' option. So in my case it would have been:
grep -rl --exclude-dir='.git' matchstring | xargs sed -i 's/matchstring/replacestring/g'
If you are in git a project then use