On Wed, Oct 8, 2008 at 9:49 PM, tony.chamberlain@lemko.com wrote:
Basically I want to find all files with a string (except binary) and change it. let STR be the string I am looking for. NEW is new
string.
Hmm, why not ditch find entirely, and just use grep? Something like:
TFIL=/usr/tmp/dummy$$.txt
grep -Ilr "$STR" * > $TFIL
for fil in $( cat $TFIL); do sed -i "s/$STR/$NEW/g" $fil done
Man grep says: "-I Process a binary file as if it did not contain matching data". Also -l gives you the filename and relative path.
If $STR contains "/"s then you could use # instead. sed -i "s#$STR#$NEW#g" $fil I dont know how much the searched for string would change, but you could test if it contained "/" and then use sed with "#" instead. Also you might want to use "sed -ibak ..." instead since this will backup the unchanged file to filename.bak, should your substitution go awry. The letters after "i" specify the extension you want to use.
Eric Sisolak
On Fri, Oct 10, 2008 at 7:19 AM, Eric Sisolak haldir.junk@gmail.com wrote:
On Wed, Oct 8, 2008 at 9:49 PM, tony.chamberlain@lemko.com wrote:
Basically I want to find all files with a string (except binary) and change it. let STR be the string I am looking for. NEW is new string.
Hmm, why not ditch find entirely, and just use grep? Something like:
TFIL=/usr/tmp/dummy$$.txt
grep -Ilr "$STR" * > $TFIL
for fil in $( cat $TFIL); do sed -i "s/$STR/$NEW/g" $fil done
That should work, but unless you actually need to see the file list, you can do this in one command:
for fil in `grep -Ilr "$STR" *`; do sed -i "s/$STR/$NEW/g" $fil; done
If you really need the file list separately, you can use `grep -Ilr "$STR" * | tee $TFIL` to get the same effect.
Note that this will not necessarily work with specific sets of files (as opposed to '*').
mhr