2012-10-23 3 views
1

동일한 소문자가 세 번 연속으로 포함 된 "words.txt"의 모든 행을 찾아서 인쇄하는 grep (또는 egrep) 명령을 작성하려고합니다. 문자가 세 번 나오면 "mooo"와 같이 연속적으로 나타나거나 "x x x"처럼 하나 이상의 공백으로 구분되지만 다른 문자로 구분되지는 않습니다.grep을 사용하여 반복 문자 감지

words.txt은 포함 :이 잘못 알고 있지만, 비록

grep -E '\b[^ ]*[[:alpha:]]{3}[^ ]*\b' 'words.txt' 

내가 구문을 충분히 알고하지 않습니다

여기
The monster said "grrr"! 
He lived in an igloo only in the winter. 
He looked like an aardvark. 

내가 좋아하는 명령이 보일 것입니다 생각입니다 그것을 알아 내기 위해. grep을 사용하여 누군가 나를 도울 수 있습니까?

답변

4

이 기능을 사용할 수 있습니까?

grep '\([[:lower:]]\) *\1 *\1' 

는 소문자 [[:lower:]]를 가지고 가고 \(... \)를 기억합니다. 어떤 숫자의 공백도 일치 시키려고 시도하는 것보다 _* (0 포함), 기억 된 문자 \1, 기억 한 숫자만큼의 공백이 있습니다. 그리고 그게 다야.

--color=auto으로 실행하여 일치하는 입력 부분을 확인할 수 있습니다.

+0

예. 작동합니다. 나는 분명히 [[: lower :]]의 중요성을 깨닫고, 그 전후는 그것을 기억합니다. * \ 1은 기억 된 캐릭터를 의미합니까? – Unknown

+0

@BernieMacinflor : 설명을 추가했습니다. '\ 1'은 처음 기억 된 문자를 의미하고, '_ *'는 여러 개의 공백을 의미합니다. – choroba

+0

backquotes에 공백을 넣을 수 없어 설명에서 공백 대신'_'을 사용했습니다. – choroba

0

시도해보십시오. 단어 경계 (\b)가 "m"앞에 오면 "mooo"와 일치하지 않습니다.

grep -E '\b([[:alpha:]]) *\1 *\1 *\b' words.txt

[:alpha:]는 문자 클래스의 표현이다. regex charset으로 사용하려면 여분의 대괄호가 필요합니다. 당신이 그것을하기 시작한 것처럼 보이지만 열린 대괄호를 닫지 않은 상태로 두었을 때 이미 이것을 알고있을 것입니다.