SED 指令未替換(工作正規表示式)

SED 指令未替換(工作正規表示式)

我正在嘗試在我的一個項目中替換所有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)

相關內容