再次回到另一个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');
答案 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