Referência back inválida usando grep

8

Por isso, estou tentando encontrar palavras de seis letras que consistem em um caractere repetido três vezes, seguido por outro caractere repetido três vezes. Por exemplo, aaabbb ou oookkk .

Estou tentando:

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

Primeiro, o regex está correto? Segundo, porque estou recebendo grep: Invalid back reference ?

    
por Highlights Factory 21.12.2014 / 11:53

1 resposta

12

Não, não está correto. Eu não tenho idéia do que o {3} é suposto ser, mas é isso que está causando problemas. Se você quiser encontrar linhas que contenham três caracteres repetidos seguidos por três outros caracteres repetidos, você pode usar isto:

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

O refere-se ao primeiro grupo capturado . Você pode capturar grupos usando parênteses. Então, é o primeiro grupo e é o segundo e assim por diante. Como você não tinha grupos capturados, grep estava reclamando de uma referência inválida, pois não tinha nada a que se referir. Então, no regex acima, os parênteses estão capturando os dois grupos. Em seguida, você deseja {2} e não {3} , pois a correspondência inicial também é contada.

Você não especifica se precisa que a correspondência seja uma palavra ou se também deseja corresponder dentro de palavras. Se você quiser que a palavra inteira corresponda (e exclua itens como aaaabbb , use isso:

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

Para imprimir apenas a parte correspondente da linha (a palavra) e não a linha inteira, use (apenas grep do GNU):

grep -owE '([a-z]){2}([a-z]){2}'
    
por 21.12.2014 / 12:19