Reputation: 73
Back again with another sed / regex question.
I've been going through a lot of older php stuff converting it to 7.0 and there are a lot of just parameter swap changes I need to make with mysql -> mysqli.
I've already done a bulk change from mysql_query -> mysqli_query using sed but I still have to put the Sql Link Connection before the query in all of them. This is kinda tedious on 4k+ files and am trying to find a way to automate it.
IE I have a lot of :
$query = mysqli_query("SELECT sp FROM sp WHERE sp='$spid'",$sql3);
$queryTwo = mysqli_query("SELECT * FROM sp WHERE sp = 'String'", $sql1);
That need to become:
$query = mysqli_query($sql3, "SELECT sp FROM sp WHERE sp='$spid'");
$queryTwo = mysqli_query($sql1, "SELECT * FROM sp WHERE sp = 'String'");
I have regex to find the ', $sqlx' or ',$sqlx' in given file here.
(\,.\$sql.|\,\$sql.)
I'm not sure how to go about bulk replacing something as dynamic as this with and google hasn't been much help. If there is something else I should use. Thanks in advance.
Edit:
The solution below (provided by 123) :
sed 's/\(mysqli_query(\)\([^,]*\),\([^)]*\)/\1\3,\2/'
Works for 80% of the use cases, but I need to be able to force the swap on the last possible comma so lines like this:
mysqli_query("UPDATE `services_exchange_publicfolder_addresses` SET `email`='$email', `member`='$member', `accesslevel`='$accesslevel', `accesslevel_new`='$accesslevel_new', `status`='$status', `step`='$step' WHERE `pkey`='$xid' LIMIT 1", $sql1);
Don't become like this:
mysqli_query( `member`='$member', `accesslevel`='$accesslevel', `accesslevel_new`='$accesslevel_new', `status`='$status', `step`='$step' WHERE `pkey`='$xid' LIMIT 1", $sql1,"UPDATE `services_exchange_publicfolder_addresses` SET `email`='$email');
Upvotes: 0
Views: 185
Reputation: 11216
If I understand the question you could use sed
sed 's/\(mysqli_query(\)\([^,]*\), *\$\([^)]*\)/\1\3,\2/' file
or perl
perl -pe 's/mysqli_query\(\K([^,]*),\s*\$([^\)]*)/$2,$1/' file
prints
$query = mysqli_query(sql3,"SELECT sp FROM sp WHERE sp='$spid'");
$queryTwo = mysqli_query(sql1,"SELECT * FROM sp WHERE sp = 'String'");
Upvotes: 1
Reputation: 20002
Depending on how the input file really is, you should look for the correct fields to match. When your input has only 1 field in double quotes, you might use
sed -r 's/("[^"]*"), *\$([^)]*)/\2, \1/' file
Upvotes: 0