grepを使って正確なパターンを何度も見つけてください。

grepを使って正確なパターンを何度も見つけてください。

入力ファイルの行は次のとおりです。

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

おすすめ記事