views:

39

answers:

2

I need to replace a single text phrase across my entire website domain with another one. What is the best way to do a mass search/ replace?

+2  A: 

If you can do it file-by-file, then you could use a simple Perl one-liner:

perl -pi -e 's/search/replace/gi' filename.txt

If you are on a UNIX system with a shell, you can combine this with find to search and replace text on files in subdirectoies:

find /dir/to/files -iname 'foo.*' -exec perl ... {}\;

where ... is the above perl command.

csl
If you're unsure of what you're doing add an extension after the -i (e.g., -i.bak) to make backups.
Jim Zajkowski
A: 

I use KEDIT to do this every day. I have a script I wrote called TooMany.kex which allows me to edit a list of files across computers and networks. The only other way I know how to do it is using a shell script - you already have that.

* TooMany.kex - perform commands on files using a directory
* (this is designed to issue edit commands to too many files for the ring buffer)
* Multiple commands are separated by a semicolon ";"
*
* eg. TooMany c\one\two\**;c\two\three\**;file
*      commands:
*      1. kedit "dirfileid.1()" (nodefext noprof'
*      2. c\one\two\**
*      3. c\two\three\**
*      4. file
*
parse arg CmdStr
if ftype.1() \= 'DIR' then do
   'alert /The File Type Must Be "DIR"./ title /TooMany/'
   exit
   end

'nomsg less /</|/>/'
if rc = 0 then do
   if nbscope.1() = 0 then do
      'alert /No files found/ title /TooMany/'
      exit
      end
   end
   'top'

* give user something to look at while macro is running
   'extract /nbfile/fileid'
* the number of files can change depending on the setting SCOPE/DISPLAY or ALL
   size = nbscope.1()
   if scope.1() = "ALL" then size = size.1()
   nfiles = size
   'msg Processing' size 'files.'
   'refresh'
   * save the directory file name
   dir_fileid = fileid.1()
   do nfiles - 1
      * if less than 3K ISA free, leave early so user has some to work with
      if memory.3() < 3 then do
         'alert $TooMany aborting. ISA nearly full. You Forgot To File.$ title $TooMany$'
         'qquit'
         exit
         end
      'down'
      'refresh'
      'kedit "'dirfileid.1()'" (nodefext noprof'
      if rc \= 0 then do
         'alert $TooMany aborting.  KEDIT rc='rc'$ title $TooMany$'
         exit
         end
      Call ExecuteCommands
      * edit file # 1 in the ring
      'kedit "'fileid.1'" (noprof'
*'refresh'
      end
* quit out of dir.dir and edit the last file
   'next'
   fid = dirfileid.1()
**   'qquit'
   'kedit "'fid'" (nodefext noprof'
   Call ExecuteCommands
   'msg TooMany:' nfiles 'file(s) processed'
exit

ExecuteCommands:
* special skip files - don't edit the directory file
if dir_fileid = fileid.1() then return
* Execute commands separated by ";"
   istart = 1
   do forever
   if pos(";",CmdStr,istart) = 0 then do
     command substr(CmdStr,istart,length(CmdStr))
     return
     end
     else do
     iend = pos(";",CmdStr,istart)
     command substr(CmdStr,istart,iend - istart)
     istart = iend + 1
     if istart > length(CmdStr) then return
     end
   end
return
Dave