SED コマンドが置換されない (正規表現が機能しない)

SED コマンドが置換されない (正規表現が機能しない)

私は自分のプロジェクトの1つですべてを置き換えようとしていますmysql から mysqli へ、そのパラメータを使用します。そのためには、フォルダー内の mysql を含むすべてのファイルを再帰的に検索し、それを mysqli に置き換えます。

元:

mysql_query($query) から mysqli_query($link, $query) へ

すべてをキャプチャすることはできますが (Regex テスターに​​よると)、何も置き換えられず、エラーも発生しませんでした。

grep -rl mysql PROJECTFILE | xargs sed -ri "s/(mysql_query)\(\$([\w-]+)\)/WhatIWant/g"

私はバックスラッシュについて読んだことがあるsedしかし、完全には理解できませんでした。出力にはエラーはありませんが、ファイルは同じままです。例や説明で何が欠けているかを知ることができれば完璧です。

mysql を mysqli に置き換えるのは簡単ですが、一度にすべて実行できれば便利です。プロジェクトで試す前に、動作することを確認するために一時ファイルを使用しています。

ありがとう。

編集: 一度に全部やりたいなら、キャプチャする必要があることは分かっていますマイスク単独で使用し、、しかしそれは単なる考えでした。


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)

関連情報