## Monday, July 12, 2010

### mass replacement of text in files

UPDATE: Phil pointed out there was an easier way to get mass replacement of text, Kudos mate.
find ./ -type f | grep -v svn  | xargs perl -pi -e "s/partA/partB/g;s/partC/partD/g;s/partE/partF/g"


Here is a crazy bit of script that uses a pair of seds to replace a several pieces of text across all files in the directory and below.

#example script that converts the following
find ./ -type f | grep -v svn | sed "s/$$.*$$/sed 's|_address_building|_address3|g' \1 > \1.script; mv \1.script \1/" | sh
find ./ -type f | grep -v svn | sed "s/$$.*$$/sed 's|_address_street|_address2|g' \1 > \1.script; mv \1.script \1/" | sh
find ./ -type f | grep -v svn | sed "s/$$.*$$/sed 's|_address|_address1|g' \1 > \1.script; mv \1.script \1/" | sh
find ./ -type f | grep -v svn | sed "s/$$.*$$/sed 's|_address12|_address2|g' \1 > \1.script; mv \1.script \1/" | sh
find ./ -type f | grep -v svn | sed "s/$$.*$$/sed 's|_address13|_address3|g' \1 > \1.script; mv \1.script \1/" | sh


1. Ash,

perl and xargs are your friends. The regexps are nicer too.

perl -pi -e "s///g" file

find ... | xargs perl -pi -e "s///g;s///g;s///g"

edits the file in place, old version is put in file.bak

2. Thanks man. perl -pi is really much more convenient for this a mass find and replace task. And I do use it too.

However the post was because I have recently been working with tasks that locate one piece of information that is the key to taking a second action hence the paired sed regexps.

I figured that applying it to simple mass search and replace task would make it easier to understand but I guess I wasn't clear about why I was using the sed's to do it in the first place.

One of my recent usages of it was to login to a group servers with what should be the same web app running in all nodes, the inner sed builds a series of commands that find and md5's all the files in the web app on each node and dumps this to a file. Then I just diff the files and it tells me if any one of the apps are off and which file is wrong... And its all 1 (nightmare-ish) line on my local shell to boot.