Search and Replace Recursively using sed and grep
I have done this so many times, still I find a new problem doing recursive search and replace each time! Here's one small shell script that puts the issues I had on the Mac doing search and replace on a directory recursively.
Save the file as rpl.sh, chmod it 755, and execute it like:
-
./rpl.sh folderContainingFiles/ oldText newText
Does the job for me! This could be done in a single line, I got some ideas of using xargs etc, but all that did not work on my Mac (at least). So resorting to this.
-
#!/bin/sh
-
grep -rl $2 $1 |
-
while read filename
-
do
-
(
-
echo $filename
-
sed "s/$2/$3/g;" $filename> $filename.xx
-
mv $filename.xx $filename
-
)
-
done
And yes, if you are going to use this, take a little time and do some argument checking before passing them around! Unless you think only a God user like you is going to use it!
Related posts:
- Finding number of lines in files recursively I wanted to find the number of lines from a...
- Recursively unlock files on Mac OS X I copied some songs from a CD and ended up...

find containingFolder/ -type f -exec sed -i~ “s/oldText/newText/g” {} \;
t3rmin4t0r
31 Dec 07 at 6:34 am
The exec part here: wouldn’t it fork a new process for every file? Is that a good practice? I thought otherwise!
Nirav
4 Jan 08 at 9:20 am
BTW, Manish has a way to do this using Perl – http://mannu.livejournal.com/406783.html.
Nirav
4 Jan 08 at 9:20 am
for i in `find` ; do sed “s/pattern/replacement/g” “$i” >> “$i.xx”; mv “$i.xx” “$i”; done
I don’t know if this work in mac.
Leonardo
25 Jun 08 at 11:30 pm
I haven’t ever seen a better file than this. It solved me days of work, you are gorgeous.
I NEVER write comments to posts because I don’t have time, but this time I have 4 working-days of free credit that you have just saved me with this file.
Thanks. ezequiel.
ezequiel
2 Sep 08 at 10:22 am
For whole words, update line 7:
sed “s/\b$2\b/$3/g;” $filename> $filename.xx
Rookie
5 Sep 08 at 6:32 pm
sed -i ’s/oldText/newText/g’ `grep -ril ‘oldText’ *` works fine for me
Trestini
2 Mar 09 at 11:31 pm
[...] used: http://www.mehtanirav.com http://www.cs.mcgill.ca Projects, [...]
Delete recursively lines from files that match a given string @ Timur Asaliev
30 Nov 09 at 6:52 pm
A small improvement:
Change
mv $filename.xx $filename
by
cp $filename.xx $filename
rm $filename.xx
and original file permissions will be preserved
Antonio
5 Dec 09 at 9:14 pm
You can avoid the creation of a temporary file using -i option for sed:
1 #!/bin/sh
2 grep -rl $2 $1 |
3 while read filename
4 do
5 (
6 echo $filename
7 sed -i “s/$2/$3/g;” $filename
8 )
9 done
Regards,
Hugo Magalhães
12 Feb 10 at 9:41 pm