パターンに一致するファイルの内容を見つけて置き換える方法は?

パターンに一致するファイルの内容を見つけて置き換える方法は?

次のファイルがあるとします。プロジェクト&$ 関数が呼び出されたときにパターンを含むフォルダ内のすべてのファイルを検索したいと思います。

たとえば、次のものを置き換える必要があります。

AnyFunction(&$arg);

そして

AnyFunction($arg);

AnyFunctionパターンに一致する未知の関数はどこにありますか?

この問題を解決するにはこれが必要です。PHPの問題

可能であれば、関数がパターンと一致する場合、その宣言も変更されることを願っています。

function AnyFunction(&$arg)

どうすればいいですか?

ベストアンサー1

ソースコードの形式が正しい場合、単語が前に来ない限り、単純なテキストアプローチが機能します。AnyFunction(arg1, &$arg2)関数呼び出しと同じ行に関数宣言がなく、関数名の間にコメントや改行がなく、関数呼び出し内の括弧の周りにバランスのとれたコメントは含まれません。 、等。これにより、コメントと文字列リテラルをキャプチャし、いくつかの複雑な関数呼び出しを見逃すことがあります(たとえば、キャプチャできません)。AnyFunction(arg1, $arg2)functionfunction&$arg2f(g(), &$arg2)

ファイルからこのスクリプトを実行すると、その場所で変更されます。警告:テストされていません。まずバックアップしてください!

#!/usr/bin/perl -pi
BEGIN { use warnings; use strict; undef $/; }
sub straighten_ampersands {
    my ($args, $want_ampersands) = @_;
    $want_ampersands = ($want_ampersands ? "&" : "");
    $args =~ s{ ([(,]\s*) &? (\$\w) }
              { $1 $want_ampersands $2 }x;
}
s{
  (\bfunction\s+|)(\w+\s+)      # optional 'function' keyword, then function name
  (\((?:(?>[^()]+)|(?4))*)\)))  # balanced parentheses (from perlre)
 }{
  "$1$2" . straighten_ampersands($3, $1 ne "")
 }ex

おすすめ記事