入力ファイルの行は次のとおりです。
d-- s--:--- a++ C- UH++++ P++++ L--- E-- W- N++++ O-- M(+) !V PS- PE+++ Y++ PGP t+ 5++ X++ R+++ tv b+++ DI+++
X+++
パターンが6回以上表示される行を見つけたいです。ここで、Xは任意の文字です。私は次のことを試しました:grep\(.*\+\+\+[[:space:]]\)\{6\}
がこれもパターンと一致しているようですX++++
。
入力例:
d-- s--:--- a++ C- UH++++ P++++ L--- E-- W- N++++ o+++++ K+++ w+++ O-- M(+) !V PS- PE+++ Y++ PGP t+
C+++ U- P++++ L+++ E W- N+ o++($) K-- w+ O-- M-- V-$ PS PE++ Y-- PGP++++ t+++ 5+++ X+++ R* tv b++ DI+ D+++ !G
希望の出力:
C+++ U- P++++ L+++ E W- N+ o++($) K-- w+ O-- M-- V-$ PS PE++ Y-- PGP++++ t+++ 5+++ X+++ R* tv b++ DI+ D+++ !G
ベストアンサー1
まず、「正確に6」を意味する{6,}
ので、「6以上」が必要です。次に、パターンの末尾に{6}
のみ追加すると、連続したパターンのみが一致します。{6,}
したがって、これは次のように一致します。
aa X+++ X+++ X+++ X+++ X+++ X+++
しかし、これはできません。
X+++ a X+++ a X+++ X+++ X+++ X+++
(${pattern}.*){6,}
したがって、「検索」を使用して$pattern
「6回以上」のゼロ文字以上を検索する必要があります。また、最後の項目が行の最後の項目で[[:space:]]
ある場合に備えて、行の末尾のみを一致させたくありません。X+++
このような:
grep -E '([^+]\+\+\+([[:space:]]|$).*){6,}' file
-E
(または)を使用する場合は、、を除いてエスケープする必要が-P
あり、そうでない場合はエスケープする必要はありませんが、文字通り受け入れたくない場合は、他の項目はエスケープする必要があります。したがって、そうでない場合は次のようになります。+
(
)
|
{
}
-E
+
-E
grep '\([^+]+++\([[:space:]]\|$\).*\)\{6,\}' file