2

コード ベースの検索にACKを使用してきましたが、これは素晴らしいツールです。ただし、(私の意見では) 重要な制限が 1 つあります。正規表現の複数行の一致は許可されません。

その制限を克服するために、特定の式を含む一連のファイルをフィルター処理してから、2 番目の式を探して再度フィルター処理したいと思います (両方の式が同じ行にない可能性が高いと仮定して)。次のコマンドを実行しようとしましたが、成功しませんでした (何も返されません)。

ack -l --type=java "(List|Collection|Map|Set)" | ack --type=java "String"

そしてgrep、.cvsディレクトリ、.svnディレクトリなどを無視して、検索をJavaファイルに制限したいので、使用したくありません(ackデフォルトで何かが行われます)何かアイデアはありますか?

4

1 に答える 1

4

現在のコマンド ラインは、ファイルのリストに対して ack を実行しており、一致したファイルのリストを検査する別のファイル セットとして使用していません。つまり、それはすることと同じでしょう

ack -l --type=java "(List|Collection|Map|Set)" > files
ack "String" files

xargs最初のコマンドからの出力を、2 番目の ack 呼び出しを実行できる一連のファイルとして処理するために使用するツールです。

ack --print0 -l --type=java "(List|Collection|Map|Set)" | xargs -0 ack "String"

--print0ファイル名をヌル文字で区切り、xargs が正しいファイル名を取得できるようにします (ファイル名に奇妙な文字が含まれている場合)。xargs への-0フラグは、ファイル名がヌルで区切られていることを期待するように指示します。

于 2011-10-21T14:44:09.267 に答える