PHP and Sed for String Substitution

I needed to replace a string in several thousand files scattered all over the filesystem on one of our servers. I used find to create a list of files that needed to be changed, along with their complete path and called it “list.txt”. It looked something like this:


/path/to/file/one/fileone.html
/path/to/file/two/filetwo.php
/path/to/file/three/filethree.htm
/path/to/directory with spaces/filefour.txt
and so on...

I worked out the “sed” command to do the in place editing, and Zach helped me whip up a quick PHP script to read the contents of “list.txt” into an array and iterate through it. He was also nice enough to show me how to use “str_replace” to escape any annoying spaces that happened to find their way into the names of directories.

  1. < ?php
  2. $files=file('list.txt');
  3.         foreach($files as $file)
  4.         {
  5.         $command='/bin/sed -i \'s/old-string/new-string/g\' '.str_replace(' ','\ ',$file);
  6.         exec($command);
  7.         }
  8. ?>

It’s a handy little script that I’m sure I will find a use for later, so I thought I would put it up here.

Ecto is Busted in WordPress 2.1

Last week I took this site to WordPress 2.1 and much to my dismay realized that Ecto, my favorite XMLRPC blogging client no longer worked. It would let me post, but it was never able to update the category information for posts… It just hung with no error. I looked into it, and found out that Ecto expects the category information to be returned as a string, not an int.

Adriaan, the developer of Ecto is blaming WordPress, while I’m sure the folks at Automattic would call it an Ecto problem… That’s just how these things tend to work. Anyhow, it’s pretty easy to fix if you make this quick change to xmlrpc.php.

Simply change this on line 180:

'categoryId' => $catid,

To this:

'categoryId' => (string) $catid,

Hopefully someone will go back to their code tree and make a permanent fix so we don’t have to constantly edit this file every time we upgrade.