How to replace a text string in multiple files in Linux
Using the GNU find, xargs and sed like this:
find -name '*.txt' -o -name '*.html' -print0 | xargs -0 -P 1 -n 10 sed --in-place 's/oldstring/newstring/g'
Adjust the -P
and -n
parameters as you like. The /g
is needed so that every occurrence in a line gets replaced, not just the first one (g
stands for global if I remember correctly). You can also pass a value to --in-place
to make a backup.
I like perl's in-place filtering recipe.
perl -pi.bak -e 's/from/to/' file1 file2 ...
In context...
% echo -e 'foo\ngoo\nboo' >test
% perl -pi.bak -e 's/goo/ber/' test
% diff -u test.bak test
--- test.bak 2010-01-06 05:43:53.072335686 -0800
+++ test 2010-01-06 05:44:03.751585440 -0800
@@ -1,3 +1,3 @@
foo
-goo
+ber
boo
here is the trimmed quick-reference on the perl incantation used...
% perl --help
Usage: perl [switches] [--] [programfile] [arguments]
-e program one line of program (several -e's allowed, omit programfile)
-i[extension] edit <> files in place (makes backup if extension supplied)
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed