web-dev-qa-db-ja.com

ack regex:同じ行の2つの単語を順番に一致させる

Word_1Word_2ではなく、以下のLine Aのように、Line BLine Cの2つの単語を順番に含むファイル内の行を見つけたい:

Line A: ... Word_1 .... Word_2 .... 
Line B: ... Word_1 ....
Line C: ... Word_2 ....

私が試してみました

$ack '*Word_1*Word_2'
$ack '(Word_1)+*(Word_2)+'

正規表現の先頭に^が追加された同じコマンド(Perlの正規表現構文に従うため)。

これらのコマンドはいずれも、関心のあるファイルや行を返しません。

何が悪いのですか?

ありがとう!

26

Word_1に続けて、何でも、何回でも、_Word_2を続けて検索します。それは

Word_1.*Word_2

*はコマンドライン検索でよく使用されるため、使用しているようですが、正規表現では、前の文字の数量詞であり、少なくとも0回一致することを意味します。たとえば、正規表現a*は0以上のasに一致しますが、正規表現a+は少なくとも1つのaに一致します。

「すべてに一致する」を意味する正規表現のメタ文字は.であるため、.*は「何にでも、何回でも一致する」という意味です。このトピックの簡単な概要については、 perlrequick を参照してください。

43
dsolimano