Référence arrière non valide à l'aide de grep

9

J'essaie donc de trouver des mots de 6 lettres qui se composent d'un caractère répété trois fois suivi d'un autre caractère répété trois fois. Par exemple aaabbbou oookkk.

J'essaie:

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

Tout d'abord, l'expression rationnelle est-elle correcte? Deuxièmement, pourquoi je reçois grep: Invalid back reference?

Highlights Factory
la source
1
Veuillez expliquer exactement ce dont vous avez besoin. Votre expression rationnelle n'est pas correcte, donc je ne peux pas comprendre ce que vous recherchez. Cherchez-vous des mots qui se composent de 3 répétitions d'un caractère puis de trois répétitions d'un autre? Ou voulez-vous aussi faire correspondre aaabbbfoobar? Et alors aaaabbb? Idéalement, montrez-nous un exemple d'entrée et la sortie souhaitée.
terdon
1
Une référence arrière doit se référer à quelque chose, et vous n'avez pas spécifié ce qu'est ce quelque chose. Habituellement, vous regroupez une expression à l'aide de parenthèses pour ce faire. Par exemple: grep -E '([a-z]{2})([0-9]{2})\2\1'correspondrait aa9999aa.
muru
@terdon Cherchez-vous des mots composés de 3 répétitions d'un caractère puis de trois répétitions d'un autre? Oui. Ou voulez-vous également faire correspondre aaabbbfoobar? Non. Seuls les mots comme oookkk(pas plus de 6 caractères) PAS les mots contenant oookkkcommeoookkkfoobar
Highlights Factory
@HighlightsFactory OK, dans ce cas, utilisez l' grep -wexemple que j'ai donné dans ma réponse.
terdon
Encore une chose, voulez-vous également faire correspondre aaaaaaou avez-vous besoin d'au moins deux personnages différents? Veuillez nous donner un exemple d'entrée et de sortie souhaitée.
terdon

Réponses:

12

Non, ce n'est pas correct. Je n'ai aucune idée de ce que \1{3}c'est censé être, mais c'est ce qui vous pose des problèmes. Si vous souhaitez rechercher des lignes contenant trois caractères répétés suivis de trois autres caractères répétés, vous pouvez utiliser ceci:

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

Le \1fait référence au premier groupe capturé . Vous pouvez capturer des groupes à l'aide de parenthèses. Ensuite, \1est le premier groupe de ce type et \2est le deuxième et ainsi de suite. Puisque vous n'aviez aucun groupe capturé, grepse plaignait d'une référence invalide car elle n'avait rien à faire. Ainsi, dans l'expression régulière ci-dessus, les parenthèses capturent les deux groupes. Ensuite, vous voulez {2}et non {3}puisque la correspondance initiale est également comptée.

Vous ne spécifiez pas si vous avez besoin que la correspondance soit un mot ou si vous souhaitez également faire correspondre les mots. Si vous voulez que le mot entier corresponde (et excluez des choses comme aaaabbb, utilisez ceci à la place:

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

Pour imprimer uniquement la partie correspondante de la ligne (le mot) et non la ligne entière, utilisez (GNU grep uniquement):

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