14

正規表現でack-is-better-than-grep(ack)を使用して、コードリポジトリ内の行とスニペットを検索しようとしています。私の理解では、ackはPerl派生の正規表現を使用していますが、それは正しいですか?

ただし、これらのクエリがどのように機能するかはわかりません。

ack 'foo'
ack '.*(foo)+.*'

ack '.*foo'
ack 'foo.*'

彼らは異なる出力を与えることができますか?もしそうなら、なぜですか?

編集:私のテストでは、それらは異なる結果を出力します(たとえば、最初のテストは他のテストよりも多くの一致を出力します)。また、同じ行のさまざまな部分を強調表示します。

編集2:出力の違いは明らかにハイライト(出力の色)に関連しています。上記のコマンドの出力で実行ackした場合、同じであることに気づきました。--nocolorどうやらackデフォルトの色で実行すると、出力の一部が私のマシン/構成で見えなくなります。Ubuntu11.04のbashからGNOMEターミナルで実行しています。

4

1 に答える 1

17

私の理解では、ackはPerl派生の正規表現を使用していますが、それは正しいですか?

はい。実際、Perlで記述されてackおり、式を内部エンジンに転送するだけです。

彼らは異なる出力を与えることができますか?もしそうなら、なぜですか?

式は同じ結果を見つけるはずです。ただし、出力ackで構文の強調表示が可能であるため(デフォルトで--nocolorは、指定されていない限り)、出力は異なる場合があります。ANSIエスケープコードを使用して出力のヒットに色を付け、明らかに(および他のクエリ)とは'foo'異なるものを強調表示します。'.*foo'

つまり、次の入力で:

This is a foo test.

のクエリで'foo'は、「<code> foo」'.*foo'が強調表示され、「<code> Thisisafoo」が強調表示されます。

于 2011-07-18T19:20:19.017 に答える