Ein Standardproblem, man will in mehreren Dateien bestimmte Passagen / Text austauschen. Diese Dateien sind auch noch in verschiedenen Unterverzeichnissen enthalten.

Typischwerweise sind es html Dateien in denen man Tags oder Inhalte austauschen will.

Mit sed und find ist das in einem Shellscript kein Problem. Folgendes Shellscript macht das gewünschte, es ersetzt eine Zeichenkette durch eine andere:

# script will search and replace all regular files for a string
# supplied by the user and replace it with another string.
#
# Written by Daniel McCarthy
# daniel.mccarthy@linuxphile.org
#
function usage {
echo ""
echo "Search/replace script"
echo " Written by Daniel McCarthy"
echo " daniel.mccarthy@linuxphile.org"
echo " http://linuxphile.org"
echo ""
echo "Not enough parameters provided."
echo "Usage: ./$0 searchstring replacestring"
echo "Remember to escape any special
characters in the searchstring or the
replacestring"
echo ""
}

#check for required parameters
if [ ${#1} -gt 0 ] && [ ${#2} -gt 0 ];
then
for f in `find -type f`;
do if grep -q $1 $f;
then cp $f $f.bak
echo "The string $1 will be replaced with $2 in $f"
sed s:$1:$2:g < $f.bak > $f rm $f.bak
fi
done
else
#print usage informamtion
usage
fi

Was ich geändert habe ist die Zeile:

sed s:$1:$2:g < $f.bak > $f

Hier habe ich statt dem / den Doppelpunkt genommen, da man dann als Argumente für das Script auch Pfadnamen eingeben kann ohne sie zu escapen.

Also diesen Code in eine Datei schreiben die man dann search_replace.sh nennt. Dann noch ein chmod +x search_replace.sh um das Script ausführbar zu machen.

Aufrufen kann man es dann so:

./search_replace.sh www.quatsch.de/spam.htm www.supportnet.de/toll.htm

Jetzt werden alle Dateien geändert die "www.quatsch.de/spam.htm" enthalten. Diese Worte werden durch "www.supportnet.de/toll.htm" ersetzt. Und zwar in allen Unterpfaden und dem Pfad von dem man das Script aufruft.