GNU/Linux >> Linux Esercitazione >  >> Linux

Espressione regolare per trovare caratteri doppi in Bash

Queste sono davvero due domande e avrebbero dovuto essere divise. Ma poiché le risposte sono relativamente semplici, le metterò qui. Queste risposte sono per GNU grep specificamente.

a) egrep è uguale a grep -E . Entrambi indicano che dovrebbero essere usate "Extended Regular Expressions" invece di grep Espressioni regolari predefinite di . grep richiede le barre rovesciate per semplici espressioni regolari.

Dal man pagina:

Espressioni regolari di base rispetto a quelle estese

Nelle espressioni regolari di base i metacaratteri ? , + , { , | , ( e ) perdono il loro significato speciale; usa invece le versioni con barra rovesciata \? , \+ , \{ , \| , \( e \) .

Vedi il man pagina per ulteriori dettagli sulle convenzioni storiche e sulla portabilità.

b) Usa egrep '(.)\1{N}' e sostituisci N con il numero di caratteri che si desidera sostituire meno uno (poiché il punto coincide con il primo). Quindi, se vuoi abbinare un carattere ripetuto quattro volte, usa egrep '(.)\1{3}' .


Questo cercherà 2 o più occorrenze dello stesso carattere:

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

Se il tuo awk ha l'opzione -o, questo stamperà ogni corrispondenza 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

ecc..

modifica

In realtà @stephane_chazelas ha ragione sui riferimenti indietro e -E. L'avevo dimenticato. L'ho provato in BSD grep e GNU grep e funziona lì ma non è in altri grep. Dovresti utilizzare una delle versioni seguenti...

Versioni regolari di grep:

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

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

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

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

Il -o anche l'opzione non è standard grep BTW (probabilmente se il tuo grep capisce -o può anche fare il riferimento all'indietro)..

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


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:

C'è un modo semplice per cercare n occorrenze dello stesso carattere, ad es. aa , tttttt

Risposta breve :

Le seguenti [variazioni di] comandi ripeteranno a almeno una e infinite volte

grep 'a\{1,}

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

egrep a{1,}

oppure, con le espressioni regolari GNU disponibiligrep a\+


Il numero di ripetizioni è impostato all'interno delle parentesi graffe, attraverso il pattern {min,max}{n} ripeti esattamente n volte, {n,} ripeti almeno n volte e {n,m} ripeti almeno n ma al massimo m volte.

Così, di conseguenza, ha sollevato la questione secondaria :

La necessità di impostare contraccolpi è legata al comando Iuse?

Risposta breve :Sì, l'uso delle barre rovesciate dipende dall'utilizzo o meno di grep o egrep

  • grep :la barra rovesciata attiva i metacaratteri [usa le espressioni regolari di base]
  • egrep barra rovesciata de -attiva i metacaratteri [usa le espressioni regolari estese]

Poiché questa è la risposta breve, voglio fornire a coloro che si sono imbattuti in problemi simili, ho aggiunto il mio riepilogo di base di ciò di cui apparentemente si deve essere consapevoli, lavorando con grep e egrep .



Espressioni regolari di base, estese e GNU

Espressioni regolari di base

Utilizzato in grep , ed e sed comando

Le caratteristiche di base del set di espressioni regolari sono:

  • La maggior parte dei metacaratteri, ad es. ? [ . \ ) ecc. vengono attivati ​​tramite 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 abbreviato [\b , \s , ecc.]

GNU Le espressioni regolari di base si aggiungono a queste

  • \? ripeti il ​​carattere zero o una volta (c\? corrisponde a c e cc ) ed è un'alternativa per \{0,1\}
  • \+ ripetere un carattere almeno una volta (c\+ corrisponde a cc , cccccccc ecc.) ed è un'alternativa a \{1,\}

  • \| è supportato (ad es. grep a\|b cercherà a o b

grep -E consente al comando di utilizzare l'intero set di espressioni regolari estese:


Espressioni regolari estese [ERE]

Usato in egrep , awk e emacs è il Basic Set più alcune caratteristiche.

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

GNU Estendi le espressioni regolari

aggiunge le seguenti funzionalità

  • classi di stenografia
  • quantificatori

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


Linux
  1. Tr Analog per i caratteri Unicode?

  2. Bash + Verifica nome tramite espressione regolare?

  3. Bash:espressioni regolari in sostituzione?

  4. Esempi di Bash for loop

  5. Come utilizzare lookahead per escludere caratteri speciali in un'espressione regolare

Bash For Loop

Espressione sequenza Bash (intervallo)

Espressioni regolari in Grep (Regex)

Come Grep per più stringhe e pattern

Bash Scripting Tutorial per principianti

Bash Heredoc Tutorial per principianti