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회 이상' 0개 이상의 문자를 찾아야 합니다 . 또한 마지막 항목이 줄의 마지막 항목 [[:space:]]인 경우를 대비하여 줄 끝 부분 만 일치시키고 싶지는 않습니다 . X+++이 같은:

grep -E '([^+]\+\+\+([[:space:]]|$).*){6,}' file

-E( 또는 )를 사용하는 경우 , , 는 제외하고 -P이스케이프해야 하며 , 그렇지 않은 경우 이스케이프할 필요는 없지만 문자 그대로 받아들이고 싶지 않은 경우 다른 항목은 이스케이프해야 합니다. 따라서 그렇지 않은 경우 다음과 같습니다.+()|{}-E+-E

grep '\([^+]+++\([[:space:]]\|$\).*\)\{6,\}' file

관련 정보