暗黙的なマルチパターンマッチングが欲しいそしてモード間は、複数のgrepを順次実行するのと同じです。
grep pattern1 | grep pattern2 | ...
それでは、これを似たようなものに変換する方法は?
grep pattern1 & pattern2 & pattern3
パラメータを動的に構築してすべてが文字列に収まる必要があるため、単一のgrepを使用したいと思います。フィルタの使用は grep ではなくシステム機能であるため、これについての議論ではありません。
この質問を以下と混同しないでください。
grep "pattern1\|pattern2\|..."
これは一つですまたはマルチパターンマッチング。私は〜を探していますそしてパターンマッチング。
ベストアンサー1
パターンリストの各パターンに一致する行を見つけるにはagrep
(元のパターン、今フラッシュ、関連性がないよりもTRE正規表現ライブラリ)は、次の構文を使用して実行できます。
agrep 'pattern1;pattern2'
GNUを使用すると、grep
PCREサポートでビルドするときに次のことができます。
grep -P '^(?=.*pattern1)(?=.*pattern2)'
そしてASTgrep
:
grep -X '.*pattern1.*&.*pattern2.*'
(sを一致文字列.*
として追加して、<x>&<y>
<x>
<y>
正確に、a&b
そのような文字列は一致しないため、絶対一致しません。はい同時にa
)b
。
パターンが重ならない場合は、次のこともできます。
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
最良のポータブル方法はおそらくawk
上記のようになります。
awk '/pattern1/ && /pattern2/'
または以下を使用してsed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
またはperl
:
perl -ne 'print if /pattern1/ && /pattern2/'
これらのすべてには異なる正規表現構文があります。
awk
//終了状態のパターンに一致する行があるかどうかを反映しません。以下を行うには:sed
perl
awk '/pattern1/ && /pattern2/ {print; found = 1}
END {exit !found}'
perl -ne 'if (/pattern1/ && /pattern2/) {print; $found = 1}
END {exit !$found}'
またはコマンドをgrep '^'
。
zgrep
潜在的にgzipで圧縮されたファイルの場合、通常はシェルスクリプトラッパーインを使用し、上記grep
のソリューションのいずれかを使用するか(その実装を使用できないため、grep
ast-openソリューションではありません)、モジュールを使用できます。入力時にファイルを透明に解凍します。grep
zgrep
PerlIO::gzip
perl
perl -MPerlIO::gzip -Mopen='IN,gzip(autopop)' -ne '
print "$ARGV:$_" if /pattern1/ && /pattern2/' -- *.gz
zgrep
(ファイルが十分に小さい場合は、各ファイルに対して実行せずに内部で解凍を実行するよりも少なくとも効率的ですgunzip
。)