Cody Savage
Cody Savage

Reputation: 73

Sed / Regex Dynamic Replacements

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

Answers (2)

123
123

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

Walter A
Walter A

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

Related Questions