In the process of upgrading PHP5.3 code I had to change all deprecated mysql_* functions to their mysqli_* counterparts.
For a lot of functions the signature stayed the same.
But mysqli_query and mysqli_connect have differences. So you can’t just find and replace them.
Instead of doing this manually, I wanted to find and replace recursively while changing the order of the arguments.
In vim:
# change mysql_query(param1, param2) to:
# mysqli_query(param2, param1)
:%s/mysql_query(\(.\{-}\),\(.\{-}\))/mysqli_query(\2, \1)/g
Using sed:
# on linux
# mysql_query(param1, param2) to
# mysqli_query(param2, param1)
sed -i 's|mysql_query(\(.*\),\(.*\))|mysqli_query(\2, \1)|g' devices.php
# on mac (otherwise you get the 'invalid command mode' when
# you run the sed command)
# mysql_query(param1, param2) to:
# mysqli_query(param2, param1)
sed -i '' -e 's|mysql_query(\([^,]*\),\([^)]*\))|mysqli_query(\2, \1)|g' devices.php
Recursively changing all files:
# in all files under current directory:
# mysql_query(param1, param2) to:
# mysqli_query(param2, param1)
fgrep -rl mysql_query . | while read file; do
sed -i '' -e 's|mysql_query(\([^,]*\),\([^)]*\))|mysqli_query(\2, \1)|g' $file
done
Note that sed
cannot do non greedy matching.
That’s why we’re searching for anything but the separator until the separator like this:
# non greedy matching with sed
\([^,]*\),
It basically states: get everything except for the comma until you get a comma (which is the first one to appear).