Sed / Regex动态替换
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');
再次返回另一个sed / regex问题。 p>
我去过 经历了很多旧的PHP东西将它转换为7.0并且我需要使用mysql进行大量的参数交换更改 - > mysqli。 p>
我已经从mysql_query做了大量更改 - > mysqli_query使用sed但我仍然需要在查询之前将Sql Link Connection放在所有这些中。 这对4k +文件来说有点乏味,我试图找到一种自动化方法。 p>
IE我有很多: p>
$ query = mysqli_query(“SELECT sp FROM sp WHERE sp ='$ spid'”,$ sql3);
$ queryTwo = mysqli_query(“SELECT * FROM sp WHERE sp ='String'”,$ sql1);
code> pre>
需要成为: p>
$ query = mysqli_query($ sql3,“SELECT sp FROM sp WHERE sp ='$ spid'”);
$ queryTwo = mysqli_query($ sql1,“SELECT * FROM sp WHERE sp ='String'”);
code> pre>
我有正则表达式找到' ,$ sqlx'或',$ sqlx'在给定文件中。 p>
(\,。\ $ sql。| \,\ $ sql。)
code > pre>
我不确定如何批量替换像动态一样的东西,谷歌并没有太大的帮助。 如果还有其他我应该使用的东西。 在此先感谢。 p>
编辑: p>
以下解决方案(由123提供): p>
sed's / \(mysqli_query(\)\([^,] * \),\([^]] * \)/ \ 1 \ 3,\ 2 /'
code> pre>
适用于80%的用例,但我需要能够强制交换最后一个可能的逗号,所以这样的行: p>
mysqli_query(“UPDATE`services_exchange_publicfolder_addresses` SET`mail` ='$ email',`member` ='$ member',`accesslevel` ='$ accesslevel',`accesslevel_new` ='$ accesslevel_new',`status` ='$ status',`step` ='$ step'WHERE`pkey` ='$ xid'LIMIT 1“,$ sql1);
code> pre>
不要变得像 这个: p>
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`cmail` ='$ email');
code> pre>
div>
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'");
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