0

だから、私は次のことをするいくつかのコンソールツール(エキゾチックなものは何もない)またはphp関数が必要です。(たとえば、file_get_contents()を使用して、独自の再帰関数を記述したくありません)

いくつかのサブディレクトリを持つディレクトリがあります。一部のファイルには次のようなものが含まれていますが<?php ech $this->translate('string'); ?>、文字列は常に異なります。

上記の関数に一致し、文字列を返すだけのパターンを作成するにはどうすればよいですか?Atm、grepとexec()を使用します。文字列を取得するための2番目の正規表現。しかし、おそらく、私はそれをより良いイベントにすることができます。

私のgrepの例:grep -r "$this[->]translate('.*')" dir

ちょっとした質問はさておき、これはどのように異なりますか:grep -r foo dirgrep -r foo dir/*

4

3 に答える 3

2

先読みアサーションと後読みアサーションを使用して、「文字列」だけを取得できます。 grep -rhoP "(?<=this->translate\(')[^']*(?='\))" dir

于 2012-04-20T00:00:43.800 に答える
1

あなたの小さな質問から始めましょう:

これはどのように異なりますか:grep -r foo dirgrep -r foo dir/*

2番目の例では、 (globと一致しないため)でdir始まる子ディレクトリ内を検索しません。.したがって、次のようなディレクトリの場合:

dir/
  .a_dotted_dir/
  a_visible_dir/

最初の例は内部.a_dotted_dirを検索しますが、2番目の例は検索しません。

上記の関数に一致し、文字列を返すだけのパターンを作成するにはどうすればよいですか?

grep自体ではできません。Grepはパターンに一致するだけですが、パターンに対していかなる種類の処理も実行しません。検索パターンに一致するファイルをリストし、それらをsedで処理することで、おそらく次のような目的を達成できます。

grep -rl "this->translate('.*')" dir |
  xargs sed -n "s/.*this->translate('\([^']*\)').*/\1/p"

また、正規表現にいくつかの変更を加えたことにも注意してください。 [->]は一致せず->$this二重引用符で囲むと、シェルが$this空の文字列に置き換えられます。を削除する$か、エスケープするか、一重引用符を使用する必要があります。

于 2012-04-19T15:05:32.837 に答える
0
  1. 角かっこを使用すると文字クラスが定義され、ドル記号はシェルによって変数として解釈されます。あなたの意味が正しいためには、それらをエスケープする必要があります。私はこのようにするかもしれません:

    echo "<?php echo \$this->translate('string'); ?>" \
      | grep -ho "\$this\s*->\s*translate('.*?')" 
      | sed "s/\$this->translate('\(.*\)')/\1/"
    

    \sの略

  2. grep -r <pattern> dirとの違いgrep -r <pattern> dir/*はやや微妙です。

    grep -r <pattern> dir/*コマンドラインで実行すると実際に何が起こるかというと、シェルdir/*は引数をディレクトリのリストに消費します。

    本質的に:

    grep -rho <pat> dir/*
    

    と同等です:

    grep -rho <pat> dir/a dir/b dir/c [etc...]
    

    ここで、「a」、「b」、および「c」はディレクトリ/ファイルです。そのため、grepは、これらの各ディレクトリと内のすべてのファイルに再帰しますが、ドットファイルdirやドットディレクトリには再帰しません。

    grep -rho <pat> dirすべてのファイルを考慮に入れる、を使用することをお勧めします。

于 2012-04-19T15:12:15.053 に答える