A simple mass Search & Replace tool.
To install:
$ brew install nvie/tap/sr
The idea for sr
is as follows: run it with just the -s
(= search) flag
first. You can preview the results and iterate on your regular expression until
it produces the matches you're looking for. Then add the -r
(replace) flag
to write files.
Unless you specify explicit files/directories, it will only search and replace in files tracked by Git. It will never write to binary files.
$ sr -s 'banana'
Check if those results match your expectations, then add an -r 'replacement'
string to replace them all:
$ sr -s 'banana' -r 'mango'
Please note that this is a destructive operation. It does not make
a backup1. Please only use this on files checked into Git, and after
checking the preview results (before adding the -r 'replacement'
flag).
$ sr -s 'banana' -r 'mango' # All files known to Git
$ sr -s 'banana' -r 'mango' src/ # All files under src/**
$ sr -s 'banana' -r 'mango' src/**/*.js # JavaScript files only
$ sr -s 'banana' -r 'mango' README.md # Just in README.md
$ sr -s 'banana' -r 'mango' . # All files under this root
The argument to -s
is a regex.
Example:
$ sr -s 'ba(na)+' -r '$1, batman!'
Will replace:
banana
→nana, batman!
bananananananana
→nanananananana, batman!
NOTE: A $
has special meaning in regexes as well as in most shells.
Therefore, always quote the arguments to -s
and -r
with single ('
)
quotes, so those $
will not get interpreted by your shell.
Another example, using named match groups:
$ sr -is '(?P<greet>hi|hello) (?P<name>.*?)!' -r 'Why ${greet}, ${name}!!'
Will replace:
hi Alice!
→Why hi, Alice!!
HELLO Bob!
→Why HELLO, Bob!!
Footnotes
-
Yet. Perhaps I'll add this feature later. ↩