Espressione regolare per trovare doppi personaggi in Bash


10

Sto cercando un'espressione regolare che trovi tutte le occorrenze di caratteri doppi in un testo, un elenco, ecc. Sulla riga di comando (Bash).

Principale Domanda : C'è un modo semplice per cercare sequenze come aa, ll, ttttt, ecc in cui si definisce un'espressione regolare che cerca n occorrenze dello stesso carattere con? Quello che sto cercando è raggiungere questo livello a un livello molto basilare. Sulla riga di comando. In una shell di Linux.

Dopo alcune ricerche sono arrivato alle seguenti risposte e alle domande che ne sono derivate, quindi mi hanno dato solo un indizio su dove potesse essere la soluzione. Ma:

a) (e) grep e il problema della barra rovesciata

  • grep 'a\{2\}' cerca aa
  • egrep'a{2}' cerca aa

Domanda: la necessità di impostare i contraccolpi è davvero legata al comando che utilizzo? Se è così, qualcuno può darmi un suggerimento cos'altro deve essere preso in considerazione quando si usa (e) grep qui?

b) Ho trovato questa risposta qui per la mia domanda, anche se non è esattamente quello che stavo cercando:

grep -E '(.)\1' filenamecerca voci con lo stesso carattere che appaiono più di una volta ma non chiede con quale frequenza . Questo è vicino a quello che sto cercando, ma voglio ancora impostare un numero di ripetizioni.

Probabilmente dovrei dividerlo in due o più domande, ma poi non voglio inondare questo fantastico sito qui.

PS: Un'altra domanda, possibilmente fuori tema, ma: è in, inside, ato on the shell. Ed è on the command linecorretto?

Risposte:


8

Queste sono due domande e avrebbero dovuto essere divise. Ma poiché le risposte sono relativamente semplici, le inserirò qui. Queste risposte sono grepspecifiche per GNU .

a) egrepè uguale a grep -E. Entrambi indicano che è necessario utilizzare "Espressioni regolari estese" invece delle grepespressioni regolari predefinite. greprichiede le barre rovesciate per semplici espressioni regolari.

Dalla manpagina:

Espressioni regolari di base vs estese

Nelle espressioni regolari di base i meta-personaggi ? , + , { , | , ( e ) perdono il loro significato speciale; utilizzare invece le versioni rovesciate \? , \ + , \ { , \ | , \ ( e \) .

Consulta la manpagina per ulteriori dettagli sulle convenzioni storiche e sulla portabilità.

b) Utilizzare egrep '(.)\1{N}'e sostituire Ncon il numero di caratteri che si desidera sostituire meno uno (poiché il punto corrisponde al primo). Quindi, se vuoi abbinare un personaggio ripetuto quattro volte, usa egrep '(.)\1{3}'.


Durante la lettura della pagina man devo aver frainteso o frainteso davvero la parte che hai indicato. Quando ho lavorato attraverso alcuni tutorial sulle espressioni regolari, non ci si aspettava alcun suggerimento su tale comportamento. Ho pensato che l'espressione regolare significhi qualcosa a un livello così basilare che la maggior parte delle applicazioni sta lavorando con lo stesso set di simboli. Ancora una volta, mi è stato smentito. Grazie per l'aiuto! Questo mi ha davvero aiutato.
Erch

È anche abbastanza confuso leggere " usa sempre la barra rovesciata per assumere il significato speciale di caratteri come., +, Ecc. " E poi scoprire che apparentemente l'opposto è la regola con il comando più elementare.
Erch

@ cellar.dweller È confuso! Gran parte del ragionamento è storico. Ho più familiarità con il modulo esteso, quindi ho l'abitudine di usare sempre solo egrepse ho bisogno di espressioni regolari (al contrario di una semplice corrispondenza di stringhe) in modo da non dovermi preoccupare di ricordare le differenze tra grepi due tipi di espressioni regolari.
depquid

4
Si noti che gli ERE standard non supportano i riferimenti indietro, mentre gli BRE standard lo fanno. Quindi grep '\(.\)\1\{3\}'è standard, grep -E '(.)\1{3}'non lo è.
Stéphane Chazelas,

7

Ciò cercherebbe 2 o più ricorrenze dello stesso personaggio:

grep -E '(.)\1+' file

Se il tuo awk ha l'opzione -o, questo lo stampa ogni partita su una nuova riga.

grep -Eo '(.)\1+' file

Per trovare corrispondenze con esattamente 3 corrispondenze:

grep -E '(.)\1{2}' file

O 3 o più:

grep -E '(.)\1{2,}' file

eccetera..


modificare

In realtà @stephane_chazelas ha ragione sui riferimenti a ritroso e -E. Me ne ero dimenticato. L'ho provato in BSD grep e GNU grep e funziona lì, ma non è in alcuni altri greps. Dovresti utilizzare una delle versioni seguenti.

Versioni grep regolari:

grep '\(.\)\1\{1,\}' file

grep -o '\(.\)\1\{1,\}' file

grep '\(.\)\1\{2\}' file

grep '\(.\)\1\{2,\}' file

L' -oopzione non è anche grep BTW standard (probabilmente se il tuo grep capisce -o può anche fare il riferimento posteriore) ..


Nota : il grep -E '(.)\1{2,}'file e il grep '\(.\)\1\{2\}'file sono errati come indicato da alexis e devono essere ignorati.


Grazie, finora. Ma: ho ragione nel dire che senza l' -Eopzione grepnon farebbe molto? Questo spiegherebbe molto, ad esempio perché ho perso così tanto tempo a cercare dove mi sbagliavo!
Erch

Senza l'opzione -E puoi fare lo stesso in questo caso, ma avresti bisogno di scappare di più e non c'è nessun +operatore .. Pubblicherò anche degli esempi.
Scrutinizer

Una piccola correzione: grep -E '(.)\1{2}'non esattamente "Trova corrispondenze con esattamente 3 corrispondenze". Sebbene corrispondano esattamente a tre caratteri identici, possono essere incorporati in una stringa ripetuta più lunga; ad esempio, corrisponderà nella stringa di 5 simboli AAAAA. (E se ci sono 6 o più simboli consecutivi, corrisponderà più di una volta).
alexis,

Sì, hai assolutamente ragione, che non funziona come previsto, in effetti non è possibile così ..
Scrutinizer

3

Innanzitutto, grazie a tutti per i vostri commenti e suggerimenti di supporto. A quanto pare, ero già abbastanza vicino alla risposta.

Il problema principale riguardava:

Esiste un modo semplice per cercare n ricorrenze dello stesso carattere, ad es aa.tttttt

Risposta breve :

I seguenti [variazioni di] comandi si ripeteranno aalmeno una e infinite volte

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

oppure, con le espressioni regolari GNU disponibili grep a\+


Il numero di ripetizioni è impostato all'interno delle parentesi graffe, attraverso lo schema {min,max}{n}ripeti esattamente nvolte, {n,}ripeti almeno nvolte e {n,m}ripeti almeno nma nella maggior parte dei mcasi.

Pertanto, di conseguenza, ha sollevato il problema secondario :

La necessità di impostare i contraccolpi è legata al comando che utilizzo?

Risposta breve : Sì, l'uso di barre rovesciate dipende dal fatto che si usi grepoegrep

  • grep: backslash attiva i metacaratteri [usa le espressioni regolari di base]
  • egrepbackslash de -Attiva metacaratteri [usi espressioni regolari estese]

Poiché questa è la risposta breve, voglio fornire a coloro che si sono imbattuti in problemi comparabili, ho aggiunto il mio riassunto di base di ciò che apparentemente si deve essere consapevoli, lavorare con grepe egrep.




Espressioni regolari di base, estese e GNU

Espressioni regolari di base

Utilizzato in grep, ede sedil comando

Le funzioni di base per le espressioni regolari sono:

  • La maggior parte dei Metacaratteri, ad es ? [ . \ ). Ecc . Sono attivati ​​da una barra rovesciata. Se non è presente una barra rovesciata, verranno presi come (parte del) termine di ricerca.
  • ^ $ \<e \>sono supportati senza una barra rovesciata
  • Nessun carattere stenografia [ \b, \secc]

A queste si aggiungono le espressioni regolari di base GNU

  • \?ripetere il carattere zero o una volta ( c\?corrispondenze ce cc) ed è un'alternativa a\{0,1\}
  • \+ripetere un personaggio almeno una volta ( c\+partite cc, ccccccccecc.) ed è un'alternativa a\{1,\}

  • \|è supportato (ad es. grep a\|bcercherà aob

grep -E abilita il comando a utilizzare l'intero set delle espressioni regolari estese:


Espressioni regolari estese [ERE]

Utilizzato in egrep, awked emacsè il set base più alcune funzionalità.

  • I metacaratteri sono disattivati ​​tramite una barra rovesciata
  • Nessun riferimento indietro
  • altro: molte delle magiche espressioni regolari di solito possono fare per una

GNU estende le espressioni regolari

aggiunge le seguenti funzionalità

I due link indirizzeranno uno a regular-expressions.info che, oltre al fantastico supporto che ho qui, mi ha davvero aiutato molto.

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.