2016-03-28 12 views
3

ackを含むファイルを検索して、ALL(いずれも定義済みのパターン)を含む行を検索するにはどうすればよいですか? ack - 複数のパターンを検索する(論理AND)

ANY(OR)は以下のように、簡単です: AND(ALL)を書くこと

ack 'pattern1|pattern2|pattern3' 

が、どのように?例えば以下の記述方法:

ackを使用して
if($line =~ /pattern1/ && $line =~ /pattern2/ && $line =~ /pattern3/) { 
    say $line 
} 

より正確には、logical andで正規表現を作成できますか?

答えて

5
/foo/s && /bar/s && /baz/s 

/^(?=.*?foo)(?=.*?bar)(?=.*?baz)/s 

のように記述することができる私たちは、実際には最後のための先読みを必要としません1。

/^(?=.*?foo)(?=.*?bar).*?baz/s 

そして、複数ある場合は、我々は一致したパターンのどのインスタンスを気にしないので、我々は

/^(?=.*foo)(?=.*bar).*baz/s 
2

最も簡単な解決策はackにチェーン呼び出しによって、プログレッシブフィルタリングを適用することです:

$ ack pattern1 | ack pattern2 | ack pattern3 | ... 
+0

yesにそれを簡素化することができます。これは、 'grep'で可能です)あまりにも。 1つのackで実行することはできません? - 例えばperl-regexesは何かを「AND」として知らないのですか? – cajwine

+1

@cajwine:正規表現は論理ではなくパターンを行います。ちょっと賢明であるためには、正規表現の中で '| 'は"または "ではなく"交互 "を意味します。 "and"のメタ文字はありません。なぜなら、それは暗黙的なデフォルトであるからです。例えばパターン「ab」は、文字「a」と文字「b」(その順序で互いに隣接する)を一致させることを要求する。複数のパターンをマッチさせるには、複数のマッチ(アンフェタミンの答えのように)またはパターンを1つにマージする(池上の答えのように)必要があります。 –

関連する問題