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

Glennは、キャプチャを必要としないソリューションを思い出しました。しかし、修正したい場合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)

関連情報