douxihui8270 2017-06-15 18:37
浏览 59
已采纳

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');
  • 写回答

2条回答 默认 最新

  • dsgnze6572 2017-06-15 18:52
    关注

    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'");
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集