web-dev-qa-db-ja.com

find -exec sedで検索/再利用可能な文字列に置き換え

基本的な検索/置換を行う小さなshスクリプトを作成しようとしていますが、小さなひねりを加えているので、間違った方向に進んでいるのではないかと思います。

古い文字列

mysql_fetch_array($foo)

これがi needです

$foo->fetch_array()

今簡単な部分は:

find . -type f -name "*.php" -exec sed -i'' -e 's/mysql_fetch_array(/->fetch_array(/g' {} +

しかし、括弧から$fooをプルして、それを前に押し出す方法がわかりません。同じsed正規表現でこれを行いますか?に保存しますか?変数とそれを再構築しますか?これに対処する最も効率的な方法は何ですか?

複数のことを試しましたが、$などのエスケープに問題があります。

[〜#〜]編集[〜#〜]

特にmatchmysql_fetch_arrayも必要であったことに注意してください-OPでそれを指定しないことの悪い点

3
Zak
find . -type f -name "*.php" -exec sed -i -e 's/^.*mysql_fetch_array(\$\([^)]*\))/$\1->fetch_array()/' {} \;
4
Eli Heady

これを使って:

find . -type f -name "*.php" -exec sed -i'' -e 's/mysql_fetch_array(\$foo)/\$foo->fetch_array\(\)/g' {} +

\を使用して$文字をエスケープします。置換用の新しい値では、parenthesisもエスケープする必要があります。

したがって、\(には)を使用する必要があります

0
MrRolling