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.