Sed / Regex动态替换

时间:2017-06-15 18:37:45

标签: php regex bash sed

再次回到另一个sed / regex问题。

我已经经历了很多旧的PHP东西,将它转换为7.0并且我需要使用mysql进行大量的参数交换更改 - > mysqli的。

我已经从mysql_query做了批量更改 - > mysqli_query使用sed但我仍然需要在查询之前将Sql Link Connection放在所有这些中。这对4k +文件来说有点乏味,我正试图找到一种自动化方法。

IE我有很多:

$query = mysqli_query("SELECT sp FROM sp WHERE sp='$spid'",$sql3);  

$queryTwo = mysqli_query("SELECT * FROM sp WHERE sp = 'String'", $sql1);

需要成为:

$query = mysqli_query($sql3, "SELECT sp FROM sp WHERE sp='$spid'"); 

$queryTwo = mysqli_query($sql1, "SELECT * FROM sp WHERE sp = 'String'");

我有正则表达式找到',$ sqlx'或',$ sqlx'在这里的给定文件中。

(\,.\$sql.|\,\$sql.)

我不确定如何批量更换像动态一样的东西,谷歌并没有多大帮助。如果还有其他我应该使用的东西。提前谢谢。

编辑:

以下解决方案(由123提供):

sed 's/\(mysqli_query(\)\([^,]*\),\([^)]*\)/\1\3,\2/'

适用于80%的用例,但我需要能够强制交换最后一个可能的逗号,所以这样的行:

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);

不要变成这样:

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');

2 个答案:

答案 0 :(得分:1)

如果我理解你可以使用sed的问题

sed 's/\(mysqli_query(\)\([^,]*\), *\$\([^)]*\)/\1\3,\2/' file

或perl

perl -pe 's/mysqli_query\(\K([^,]*),\s*\$([^\)]*)/$2,$1/' file

打印

$query = mysqli_query(sql3,"SELECT sp FROM sp WHERE sp='$spid'");

$queryTwo = mysqli_query(sql1,"SELECT * FROM sp WHERE sp = 'String'");

答案 1 :(得分:0)

根据输入文件的确实情况,您应该查找要匹配的正确字段。当您的输入只有双引号的1个字段时,您可以使用

sed -r 's/("[^"]*"), *\$([^)]*)/\2, \1/' file