
我正在嘗試在我的一個項目中替換所有mysql 到 mysqli,及其參數。為此,我遞歸地搜尋資料夾中帶有 mysql 的所有文件,並將其替換為 mysqli。
前任:
mysql_query($query) 到 mysqli_query($link, $query)
我能夠捕獲所有內容(根據正則表達式測試器),但似乎沒有任何內容被替換,也沒有錯誤。
grep -rl mysql PROJECTFILE | xargs sed -ri "s/(mysql_query)\(\$([\w-]+)\)/WhatIWant/g"
我讀過有關反斜線的內容sed但不太明白;輸出沒有錯誤,但檔案保持不變。如果我只能透過範例或解釋知道缺少什麼,那就完美了。
將 mysql 替換為 mysqli 很容易,但最好一次完成所有操作。我使用臨時文件只是為了確保它可以正常工作,然後才能在我的專案中嘗試它。
謝謝。
編輯:我知道如果我想一次完成所有工作,我必須捕捉mysql單獨並添加一個我,但這只是一個想法。
對於 tedron,我想要的輸出將與此類似。
sed -ri "s/(mysql_query)\(\$([\w-]+)\)/mysqli_query($link, \2)/g" filename
格倫提出了一個不進行捕獲的解決方案。但是,如果我想修改mysql_fetch_array($查詢),那麼我可能必須使用正規表示式來保留第一個參數並附加MYSQLI_BOTH例如。
解決方案:
感謝 tedron,我能夠以我的方式解決我的問題:
sed -ri 's/(mysql)_query\((\$[a-zA-Z_-]+)\)/\1i_query($link, \2)/' filename
對於 mysqli_fetch_array:
sed -ri 's/(mysql)(_fetch_array)\((\$[a-zA-Z_-]+)\)/\1i\2(\3, MYSQLI_BOTH)/' filename
正如我在問題中所做的那樣,使用它來grep
立即修改目錄。
答案1
你不需要捕獲任何東西:
sed 's/mysql_query(/mysqli_query($link, /g' file
-i
測試時不要使用,當您對結果滿意時添加。
答案2
使用擴展正規表示式 ( ) 的另一種可能性-r
:
sed -r 's/(mysql)(_query\()/\1i\2$link,/g'
答案3
您不需要圍繞 捕獲組mysql_query
,因為您不會將其複製到替換中。您只需要捕獲查詢參數,因為每次呼叫都會有所不同。
sed -ri 's/mysql_query\s*\((\$\w+)\)/mysqli_query($link, \1)/g'
答案4
問題是\w
.我只是在試圖弄清楚這裡發生了什麼時自己發現了這一點,但顯然,類似\s
或\w
已經是字符類的東西不能在帶有 ERE 的其他字符類中使用(它們可以與 PCRE 一起使用)。為了顯示:
$ echo foo- | sed -r 's/[\w-]+/bar/'
foobar
$ echo 'w\-foo' | sed -r 's/[\w-]+/bar/'
barfoo
$ echo foo- | sed -r 's/\w+/bar/'
bar-
因此,在字元類別中,字元轉義類別被視為文字字元[ ]
。該表達式的[\w-]
意思是「匹配\
,w
或中的任何一個-
。
要使正規表示式起作用,請使用[a-zA-z_]
代替\w
或使用分組括號:
$ echo 'mysql_query($query)' |
sed -r 's/mysql_query\(\$(\w|-)+\)/WhatIWant/'
WhatIWant
特別針對您的範例:
$ echo 'mysql_query($query)' |
sed -r 's/(mysql_query)\((\$[a-zA-Z_-]+)\)/\1($link,\2)/'
mysql_query($link,$query)