grep을 사용한 잘못된 역참조

grep을 사용한 잘못된 역참조

그래서 한 문자가 3번 반복되고 다른 문자가 3번 반복되는 6개의 문자 단어를 찾으려고 합니다. 예를 들어 aaabbb또는 oookkk.

노력하고있어:

grep -E "[a-z]\1{3}\S[a-z]\1{3}" filename

첫째, 정규 표현식이 올바른가요? 둘째, 왜 내가 그것을 얻나요 grep: Invalid back reference?

답변1

아니요, 이는 잘못된 내용입니다. \1{3}그것이 무엇인지는 모르겠지만 , 그것이 바로 문제의 원인입니다. 세 개의 반복 문자와 그 뒤에 다른 세 개의 반복 문자가 포함된 줄을 찾으려면 다음 명령을 사용할 수 있습니다.

grep -E '([a-z])\1{2}([a-z])\2{2}'

이는 \1첫 번째를 가리킨다.캡처됩니다그룹. 대괄호를 사용하여 그룹을 캡처할 수 있습니다. 그런 다음 \1첫 번째 그룹, \2두 번째 그룹 등이 진행됩니다. 캡처된 그룹이 없기 때문에 grep참조할 항목이 없기 때문에 잘못된 참조에 대해 불평합니다. 따라서 위 정규식에서 괄호는 이 두 그룹을 캡처합니다. 그런 다음 초기 일치도 계산되므로 원 {2}하거나 원하지 않습니다 .{3}

단어를 일치시켜야 하는지 또는 단어 내에서도 일치할지 여부를 지정할 필요가 없습니다. 전체 단어를 일치시키고 이와 같은 것을 제외하려면 다음을 aaaabbb대신 사용하십시오.

grep -wE '([a-z])\1{2}([a-z])\2{2}'

전체 줄 대신에 일치하는 줄 부분(단어)만 인쇄하려면 다음을 사용하세요(GNU grep에만 해당):

grep -owE '([a-z])\1{2}([a-z])\2{2}'

관련 정보