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 aaabbb
ou 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
?
command-line
grep
regular-expression
Highlights Factory
la source
la source
aaabbbfoobar
? Et alorsaaaabbb
? Idéalement, montrez-nous un exemple d'entrée et la sortie souhaitée.grep -E '([a-z]{2})([0-9]{2})\2\1'
correspondraitaa9999aa
.oookkk
(pas plus de 6 caractères) PAS les mots contenantoookkk
commeoookkkfoobar
grep -w
exemple que j'ai donné dans ma réponse.aaaaaa
ou avez-vous besoin d'au moins deux personnages différents? Veuillez nous donner un exemple d'entrée et de sortie souhaitée.Réponses:
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:Le
\1
fait référence au premier groupe capturé . Vous pouvez capturer des groupes à l'aide de parenthèses. Ensuite,\1
est le premier groupe de ce type et\2
est le deuxième et ainsi de suite. Puisque vous n'aviez aucun groupe capturé,grep
se 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:Pour imprimer uniquement la partie correspondante de la ligne (le mot) et non la ligne entière, utilisez (GNU grep uniquement):
la source