I need to use this command every once in awhile and I always forget how to do it off the top of my head.
grep -lr --exclude-dir=".git" -e "oldword" . | xargs sed -i '' -e 's/oldword/newword/g'
If you're on Windows you'll need unix command-line tools installed. The easiest way to do that is with Gow.
Here's what each piece does:
grepsearches for text in files recursively in a directory.- The
-lflag forgreptells it to only output file names when it finds a word match. - The
-rflag tellsgrepto search recursively in the directory, i.e. it will also look in subfolders if applicable. --exclude-dir=".git"is optional; it tellsgrepto ignore files in the.gitdirectory. You can have more than one--exclude-dirflag if you want to exclude multiple folders. Usually you won't want to look in the git folder though, if your folder is being tracked by git. Similarly, you can use the--excludeflag to exclude files with certain patterns in their names, for example--exclude="*\.min\.*"will exclude files with.min.in their names. (You'll commonly want to exclude dependency folders likenode_modulesas well.)-e "oldword"The-eflag forgrepsays that the following argument is a regular expression and can be omitted if you just want to type in a normal word or phrase."oldword"is the old word/expression you want to replace.- The dot (
.) tellsgrepto look in the current directory. You can change that to a directory path, a specific file, or an asterisk (*) if you want to search files in the current directory non-recursively. - The pipe (
|) tellsxargsto operate on the output of thegrepcommand. xargstellssedto use the output ofgrep.sed -imodifies text files. It takes an argument (the empty string''in this case) which is a suffix for the output file; if the empty string is passed (as we are doing here) it will replace the input file.-e "s/oldword/newword/g"tellssedto replace every instance ofoldwordwithnewword. "s" means replace and "g" means every instance (as opposed to just the first one).oldwordis a regular expression. You can omitnewwordif you just want to delete a word.
If you only want to operate on a single file and you already know which one it is, you can skip the grepping and just use sed. Wikipedia has a bunch of examples.
Update: @collinalexbell points out that you can append -D skip to the grep command to prevent it from processing mounted devices and sockets in the top level of the directory you're searching.