grep per stringhe alfanumeriche di qualsiasi lunghezza con due punti su ciascun lato


14

Come faresti per ottenere stringhe alfanumeriche da 1 a 50 caratteri (idealmente, funzionerebbe anche qualsiasi lunghezza) con i due punti su ciascun lato - un risultato tipico sarebbe tutte le linee che contengono la stringa :shopping:. Finora ho il codice qui sotto (ho provato alcune varianti su di esso) che non funziona:

grep ':[[:alnum:]]{1,100}:' ~/x.txt

Devi solo abilitare le funzionalità regex estese grepincludendo lo -Eswitch.
slm

Risposte:


13

È necessario abilitare espressioni regolari estese per questo:

grep -E ':[[:alnum:]]+:' ~/x.txt

4

Con le espressioni regolari di base, puoi scriverlo come:

grep ':[[:alnum:]]\{1,100\}:' ~/x.txt

Si noti che \{(al contrario \+o \?per esempio) è standard e portatile, e in realtà gli equivalenti BRE di +e ?sono tipicamente scritti con \{: \{1,\}e \{0,1\}. grep -Eè anche standard e portatile, quindi potresti anche usarlo in quanto rende regexps più leggibili in quei casi.


1

Stai utilizzando un'espressione regolare estesa, quindi devi utilizzare l'opzione -E:

grep -E ':[[:alnum:]]{1,100}:' ~/x.txt

Grazie! Ho inserito l'altra risposta come corretta perché non ho scritto il mio script "ideale" nel titolo e non voglio fare in modo che le persone che cercano una risposta su Google copino incollino la risposta sbagliata, ma userò la tua. :)

1
@TorThommesen: puoi modificare il titolo della tua Q se non è corretto.
slm

0

Dal momento che nessun altro l'ha menzionato, puoi anche usare egrep, che, a quanto ho capito, è equivalente a grep -E.

egrep ':[[:alnum:]]{1,100}:' ~/x.txt

1
egrepera il comando storico di grep con ERE. Le funzionalità di grep ed egrep sono state (molto tempo fa) unite in grep con l'opzione -E. egrepè ora considerato obsoleto / deprecato (ma è improbabile che alcune persone vi siano ancora abituate).
Stéphane Chazelas,
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.