Problem
I need to recursively scan all files and subdirectories within a directory for a particular string and replace it with another string.
I’m aware that the command to locate it might be as follows:
grep 'string_to_find' -r ./*
But how can I change every occurrence of string to find to anything else?
Asked by billtian
Solution #1
Another way is to use search and then sed to process the results.
find /path/to/files -type f -exec sed -i 's/oldstring/new string/g' {} \;
Answered by rezizter
Solution #2
I found out the answer.
grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'
Answered by billtian
Solution #3
You may also do it this way:
Example
grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'
This will search all files in the current directory for the string ‘windows’ and replace ‘windows’ with ‘linux’ for each occurrence of the string.
Answered by Dulith De Costa
Solution #4
On OS X, this works best for me:
grep -r -l 'searchtext' . | sort | uniq | xargs perl -e "s/matchtext/replacetext/" -pi
Source: http://www.praj.com.au/post/23691181208/grep-replace-text-string-in-files
Answered by Marc Juchli
Solution #5
sed -i’s/string to find/another string/g’ or perl -i.bak -pe’s/string to find/another string/g’ are usually used instead of grep.
Answered by minopret
Post is based on https://stackoverflow.com/questions/15402770/how-to-grep-and-replace