Referencia inversa no válida con grep

9

Así que estoy tratando de encontrar palabras de 6 letras que consisten en un carácter repetido tres veces seguido de otro carácter repetido tres veces. Por ejemplo aaabbbo oookkk.

Estoy intentando:

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

Primero, ¿es correcta la expresión regular? Segundo, ¿por qué me estoy poniendo grep: Invalid back reference?

Destacados de fábrica
fuente
1
Por favor, explique exactamente lo que necesita para que coincida. Tu expresión regular no es correcta, así que no puedo entender lo que buscas. ¿Estás buscando palabras que consisten en 3 repeticiones de un personaje y luego tres repeticiones de otro? ¿O también quieres combinar aaabbbfoobar? ¿Qué hay de aaaabbb? Idealmente, muéstranos alguna entrada de ejemplo y tu salida deseada.
terdon
1
Una referencia inversa debe referirse a algo, y no ha especificado qué es ese algo. Por lo general, agrupa una expresión usando paréntesis para hacerlo. Por ejemplo: grep -E '([a-z]{2})([0-9]{2})\2\1'coincidiría aa9999aa.
muru
@terdon ¿Estás buscando palabras que consisten en 3 repeticiones de un personaje y luego tres repeticiones de otro? Si. ¿O también quieres hacer coincidir aaabbbfoobar? No. Sólo las palabras como oookkk(no más de 6 caracteres) no palabras que contienen oookkkcomooookkkfoobar
Aspectos destacados de fábrica
@HighlightsFactory OK, en ese caso use el grep -wejemplo que di en mi respuesta.
terdon
Una cosa más, ¿también quieres unir aaaaaao necesitas al menos dos personajes diferentes? Considere darnos una entrada de ejemplo y la salida deseada.
terdon

Respuestas:

12

No, no es correcto. No tengo idea de qué \1{3}se supone que es, pero eso es lo que te está causando problemas. Si desea buscar líneas que contengan tres caracteres repetidos seguidos de otros tres caracteres repetidos, puede usar esto:

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

El se \1refiere al primer grupo capturado . Puede capturar grupos usando paréntesis. Entonces, \1es el primer grupo de este tipo y \2es el segundo y así sucesivamente. Como no tenía grupos capturados, grepse quejaba de una referencia no válida ya que no tenía nada a lo que referirse. Entonces, en la expresión regular anterior, los paréntesis capturan los dos grupos. Entonces, usted quiere {2}y no, {3}ya que la coincidencia inicial también se cuenta.

No especifica si necesita que la coincidencia sea una palabra o si también desea coincidir dentro de las palabras. Si desea que la palabra completa coincida (y excluya cosas como aaaabbb, use esto en su lugar:

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

Para imprimir solo la parte coincidente de la línea (la palabra) y no toda la línea, use (solo GNU grep):

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