Ungültige Rückreferenz mit grep

9

Ich versuche also, Wörter mit 6 Buchstaben zu finden, die aus einem Zeichen bestehen, das dreimal wiederholt wird, gefolgt von einem anderen Zeichen, das dreimal wiederholt wird. Zum Beispiel aaabbboder oookkk.

Ich versuche:

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

Ist der Regex korrekt? Zweitens, warum bekomme ich grep: Invalid back reference?

Highlights Fabrik
quelle
1
Bitte erläutern Sie, was genau Sie benötigen. Ihre Regex ist nicht korrekt, daher kann ich nicht verstehen, wonach Sie suchen. Suchen Sie nach Wörtern, die aus 3 Wiederholungen eines Zeichens und dann drei Wiederholungen eines anderen bestehen? Oder willst du auch passen aaabbbfoobar? Was ist mit aaaabbb? Zeigen Sie uns im Idealfall einige Beispieleingaben und Ihre gewünschte Ausgabe.
Terdon
1
Eine Rückreferenz sollte sich auf etwas beziehen, und Sie haben nicht angegeben, was das ist. Normalerweise gruppieren Sie dazu einen Ausdruck in Klammern. Zum Beispiel: grep -E '([a-z]{2})([0-9]{2})\2\1'würde übereinstimmen aa9999aa.
Muru
@terdon Suchen Sie nach Wörtern, die aus 3 Wiederholungen eines Zeichens und dann drei Wiederholungen eines anderen bestehen? Ja. Oder möchten Sie auch mit aaabbbfoobar übereinstimmen? Nein. Nur Wörter wie oookkk(nicht länger als 6 Zeichen) NICHT Wörter oookkkwieoookkkfoobar
Highlights Factory
@HighlightsFactory OK, in diesem Fall verwenden Sie das grep -wBeispiel, das ich in meiner Antwort gegeben habe.
Terdon
Noch eine Sache, möchtest du auch übereinstimmen aaaaaaoder brauchst du mindestens zwei verschiedene Charaktere? Bitte geben Sie uns eine Beispieleingabe und die gewünschte Ausgabe.
Terdon

Antworten:

12

Nein, das stimmt nicht. Ich habe keine Ahnung, was das sein \1{3}soll, aber das ist es, was dir Probleme bereitet. Wenn Sie Zeilen suchen möchten, die drei wiederholte Zeichen gefolgt von drei weiteren wiederholten Zeichen enthalten, können Sie Folgendes verwenden:

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

Das \1bezieht sich auf die erste erfasste Gruppe. Sie können Gruppen mithilfe von Klammern erfassen. Dann \1ist die 1. solche Gruppe und \2ist die zweite und so weiter. Da Sie keine erfassten Gruppen hatten, grepbeschwerten Sie sich über eine ungültige Referenz, da sie nichts zu referenzieren hatte. In der obigen Regex erfassen die Klammern die beiden Gruppen. Dann möchten Sie {2}und nicht, {3}da auch die anfängliche Übereinstimmung gezählt wird.

Sie geben nicht an, ob die Übereinstimmung ein Wort sein soll oder ob Sie auch innerhalb von Wörtern übereinstimmen möchten. Wenn Sie möchten, dass das gesamte Wort übereinstimmt (und Dinge wie ausschließen) aaaabbb, verwenden Sie stattdessen Folgendes:

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

Verwenden Sie (nur GNU grep), um nur den übereinstimmenden Teil der Zeile (das Wort) und nicht die gesamte Zeile zu drucken:

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