1

これは私の最初の投稿です。ここは素晴らしい場所であり、私を大いに助けてくれます !

だから私はpcgrepを使っていて、自分のパターンでファイルをキャッチしたいと思っています。次のような正規表現に変数を使用しています。

test="<\?php\n.*. = Array\(('.'=>'.', ){20,}.*\);\nfunction .*\(.*, .*\).*for\(.i=0; .i .*\nreturn base64_decode(.*);}\n.* ('.*'.\n){10,}.*"

次に、ファイルを検索します。

find . -type f -name "*.php1" -print0 | xargs -0 pcregrep --colour=auto -M "$test"

test.sh (私が使用している bash ファイル) と、一致させたい *.php1 ファイルをここで見つけることができます: http://sendrev.com/stackoverflow/

sh test.sh を実行すると、常に行が検索されます (使用しているため、色で表示されました--colour=auto)。

'yzr3YEca5VacRthC6tGoXNkS2n8S2n8S2n8S2n8S2n8S4wUSFBc9FhGcqtcP6JTk4J0kj5TOMZ0yYmL'. 

(またはその他ですが、ファイルの終わりは表示されません)

それ以上の行を一致させることができず、その理由がわかりません。最後の行を次のようなものと一致させたい:

"eval\(.*(.*, .*\)\);\?>$"

また

"\)\);\?>"

しかし、私はその行に行くことはできません。"));\?>" を "test" 変数の末尾に追加すると、最後の行に移動できないため、何も見つかりません。

!!! 重要なのは、行'.*'.がすべてよりもはるかに少ない場合は問題ないということです。理解できない制限があるようです。

CentOS またはその他の Linux ディストリビューションがある場合は、テストできます。

私の方から間違い探しを手伝っていただけないでしょうか?ありがとう。

4

1 に答える 1

0

正規表現を変更せずに、このタイプの検索で別の解決策(grep)を見つけました:
find . -type f -name "*.php" -print0 | xargs -0 grep --colour -Pzo "$test1"

説明:
-Pgrep の perl-regexp をアクティブ化 (通常の拡張機能の強力な拡張機能)
-z行末の改行を抑制し、ヌル文字に置き換えます。
つまり、grep は行末がどこにあるかを認識していますが、入力を 1 つの大きな行として認識します。
-o一致するものだけを印刷します。

私は大丈夫だと思いますが、なぜpcgrepで動かないのか謎です。

于 2015-04-11T03:49:05.353 に答える