Как в Linux найти и рекурсивно заменить строку во всех файлах?

Допустим нам требуется заменить email: root@mail.domain.ru на sf@nagg.ru во всех файлах в каталоге /home/www. Наиболее оптимальным вариантом выглядит следующая конструкция:
find /home/www -type f -print0 | xargs -0 sed -i 's/root@mail\.domain\.ru/sf@nagg.ru/g'
В данной конструкции используется print0, ниже выдержка из man find:
-print0 (GNU find only) tells find to use the null character (\0) 
instead of whitespace as the output delimiter between pathnames found. 
This is a safer option if you files can contain blanks or other special character. 
It is recommended to use the -print0 argument to find if you use -exec command or xargs 
(the -0 argument is needed in xargs.).
После выполнения, мы можем проверить что root@mail.domain.ru более нигде не прописан (файлов в выводе не должно быть):
grep -rl 'root@mail.domain.ru' /home/www/
Альтернативный вариант замены email, который, вероятно, более простой:
find /home/www/ -type f -exec sed -i 's/sf@nagg\.ru/root@mail.domain.ru/g' {} +
Учтите, что если вы используете BSD sed (это относится также к Mac OS X), вам нужно добавить пустую строку, используя аргумент sed-а -i '', это решает Mac OS X проблему sed: 1: "...": invalid command code. Выглядеть это будет так:
sed -i '' 's/sf@nagg\.ru/root@mail.domain.ru/g' {} +