Using sed recursive on a file system
Best solution for me so far
use the following phase, do not put it into a script, just replace the 4 variables. When I put it into a script I sometimes get weird behaviour, depending on the search pattern.
sed -i s/$SEARCH/$REPLACE/g `grep -irl $SEARCH * --include=$PATTERN`
simple change of multiple files, even in multiple directories
If you want to use sed on many files you always should first try to do it the easy way:
sed -i 's/lookingFor/replacingWith/g' */*.c # many files in many directories
But if you have to have more control there are two ways I currently know of:
let find do the searching
find . -type f -exec sed -i 's/lookingFor/replacingWith/g' {} +
find will iterate all directories below the given "." and call the given command for each file. {} will be replaced with the filenames. The + tells find to give many files at the same time to the given command. I do not really understand the use of + here, the manpage does not use it in its examples. But it works. So currently I'd keep it. If I would not use the second solution. Beware of problems with {} when the filenames may contain spaces. Perhaps you'll have to do put something like \' arround them, not sure if there even is a problem. Just a hint.
let grep find the files and then use sed on these files
sed -i 's/lookingFor/replacingWith/g' `grep -ril 'lookingFor' * --include=*.cpp`
You will have to use ticks around the grep command ! The disadvantage of this is, that you'll have to give the 'lookingFor' twice. But you could use a script too... :-)
#!/bin/bash # replace-in-files if [ "$1" = "--help" ] || [ $# -ne 4 ]; then echo replace-in-files v 0.1, it@andreas-duffner.de echo this file will replace text in given files echo Syntax: $0 \<dir\> \<lookingFor\> \<replaceWith\> \<filePattern\> echo Example: $0 . Bug Feature '*.cpp' exit 1 fi DIR=$1 SEARCH=$2 REPLACE=$3 PATTERN=$4 sed -i s/$SEARCH/$REPLACE/g `grep -irl $SEARCH * --include=$PATTERN`