Riferimento indietro non valido utilizzando grep


9

Quindi sto cercando di trovare parole di 6 lettere che consistono in un carattere ripetuto tre volte seguito da un altro carattere ripetuto tre volte. Ad esempio aaabbbo oookkk.

Sto provando:

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

Innanzitutto, il regex è corretto? Secondo perché sto ricevendo grep: Invalid back reference?


1
Spiega che cosa devi abbinare esattamente. Il tuo regex non è corretto, quindi non riesco a capire cosa stai cercando. Stai cercando parole che consistono in 3 ripetizioni di un personaggio e poi tre ripetizioni di un altro? O vuoi anche abbinare aaabbbfoobar? Che dire aaaabbb? Idealmente, mostraci alcuni esempi di input e i risultati desiderati.
terdon

1
Un backreference dovrebbe fare riferimento a qualcosa e non hai specificato cosa sia quel qualcosa. Di solito si raggruppa un'espressione usando le parentesi per farlo. Ad esempio: grep -E '([a-z]{2})([0-9]{2})\2\1'corrisponderebbe aa9999aa.
Muru,

@terdon Stai cercando parole che consistono in 3 ripetizioni di un personaggio e poi tre ripetizioni di un altro? Sì. O vuoi anche abbinare aaabbbfoobar? No. Solo parole come oookkk(non più di 6 caratteri) NON parole contenenti oookkklikeoookkkfoobar
Punti salienti della fabbrica del

@HighlightsFactory OK, in tal caso usa l' grep -wesempio che ho dato nella mia risposta.
terdon

Ancora una cosa, vuoi anche abbinare aaaaaao hai bisogno di almeno due personaggi diversi? Si prega di considerare di darci un esempio di input e output desiderato.
terdon

Risposte:


12

No, non è corretto. Non ho idea di cosa \1{3}dovrebbe essere, ma questo è ciò che ti sta causando problemi. Se vuoi trovare linee che contengono tre caratteri ripetuti seguiti da altri tre caratteri ripetuti, puoi usare questo:

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

Il si \1riferisce al primo gruppo acquisito . È possibile acquisire gruppi utilizzando le parentesi. Quindi, \1è il primo di questi gruppi ed \2è il secondo e così via. Dato che non avevi gruppi catturati, grepsi lamentava di un riferimento non valido poiché non aveva nulla a cui fare riferimento. Quindi, nella regex sopra, le parentesi stanno catturando i due gruppi. Quindi, si desidera {2}e non {3}poiché viene conteggiata anche la corrispondenza iniziale.

Non si specifica se è necessario che la corrispondenza sia una parola o se si desidera abbinare anche le parole. Se vuoi che l'intera parola corrisponda (ed escluda cose come aaaabbb, usa questa invece:

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

Per stampare solo la parte corrispondente della riga (la parola) e non l'intera riga, utilizzare (solo GNU grep):

grep -owE '([a-z])\1{2}([a-z])\2{2}'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.