Então, eu estou tentando encontrar palavras de 6 letras que consistem em um caractere repetido três vezes, seguido por outro caractere repetido três vezes. Por exemplo aaabbb
ou oookkk
.
Eu estou tentando:
grep -E "[a-z]\1{3}\S[a-z]\1{3}" filename
Primeiro, o regex está correto? Segundo, por que estou recebendo grep: Invalid back reference
?
command-line
grep
regular-expression
Fábrica de Destaques
fonte
fonte
aaabbbfoobar
? Que talaaaabbb
? Idealmente, mostre-nos alguns exemplos de entrada e a saída desejada.grep -E '([a-z]{2})([0-9]{2})\2\1'
corresponderiaaa9999aa
.oookkk
(não mais que 6 caracteres) NÃO são palavras que contêmoookkk
comooookkkfoobar
grep -w
exemplo que dei na minha resposta.aaaaaa
ou precisa de pelo menos dois caracteres diferentes? Por favor, considere nos dar um exemplo de entrada e saída desejada.Respostas:
Não, não está correto. Não tenho idéia do que
\1{3}
deveria ser, mas é isso que está causando problemas. Se você deseja encontrar linhas que contêm três caracteres repetidos seguidos por outros três caracteres repetidos, você pode usar isso:O
\1
refere-se ao primeiro grupo capturado . Você pode capturar grupos usando parênteses. Então,\1
é o 1º desse grupo e\2
é 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. Portanto, no regex acima, os parênteses estão capturando os dois grupos. Então, você quer{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 deseja também corresponder às palavras. Se você deseja que a palavra inteira corresponda (e exclua coisas como
aaaabbb
, use isso:Para imprimir apenas a parte correspondente da linha (a palavra) e não a linha inteira, use (somente grep GNU):
fonte