2017-06-15 152 views
0

回到另一個sed/regex問題。Sed /正則表達式動態替換

我已經經歷了很多老的php的東西,將其轉換爲7.0,並且有很多隻需要使用mysql - > mysqli進行的參數交換更改。

我已經使用sed從mysql_query - > mysqli_query進行了批量更改,但我仍然必須將Sql鏈接連接放在所有這些查詢之前。這對於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/' 

Works的用例的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

所以你只是想切換逗號的兩側? – 123

回答

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'"); 
+0

op還希望在'sqlN'之前重新設置'$'。 –

+0

那...... 這非常簡單,我不知道爲什麼我沒有看到它那樣。 我怪怪大腦疲勞,非常感謝。 –

+0

有沒有辦法強制這個解決方案只基於行中的最後一個逗號進行交換?當我在列名或變量之間插入逗號時,它似乎陷入困境並交換不正確。 –

0

根據如何輸入文件真的是,你應該尋找正確的字段匹配。當你的輸入只有雙引號中的1個字段時,你可以使用

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