Find all occurrences of $MATCH
and replace with $REPLACE
(inspired by this post):
git grep -l "$MATCH" | xargs sed -i "" -e "s/$MATCH/$REPLACE/g"
Find all occurrences of $MATCH
but exclude $EXCLUDE
and replace with $REPLACE
:
git grep -l -e "$MATCH" --and --not -e "$EXCLUDE" | xargs sed -i "" -e "/$EXCLUDE/! s/$MATCH/$REPLACE/g"
Example
Here’s an example of how to replace foo
with bar
in your repository:
MATCH="foo"
REPLACE="bar"
git grep -l "$MATCH" | xargs sed -i "" -e "s/$MATCH/$REPLACE/g"
Here’s an example of how to replace foo
with bar
(but not foobar
) in your repository:
MATCH="foo"
EXCLUDE="foobar"
REPLACE="bar"
git grep -l -e "$MATCH" --and --not -e "$EXCLUDE" | xargs sed -i "" -e "/$EXCLUDE/! s/$MATCH/$REPLACE/g"
Explanation
git grep
prints lines matching a pattern in the repository:
git grep "$MATCH"
git grep -l
prints file paths matching a pattern in the repository:
git grep -l "$MATCH"
--and --not -e
is used to exclude a pattern:
git grep -l -e "$MATCH" --and --not -e "$EXCLUDE"
The file paths are piped to xargs
, which converts the paths into arguments for the sed
command:
$FILE_PATHS | xargs sed
sed
then does a global string replacement in place of the file:
sed -i "" -e "s/$MATCH/$REPLACE/g"
To learn more about
sed
, see “Replace text with sed”.
Finally, /$EXCLUDE/!
in the command helps exclude a pattern from the match:
sed -i "" -e "/$EXCLUDE/! s/$MATCH/$REPLACE/g"