입력 파일의 행은 다음과 같습니다.
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