GNU/Linux >> Linux Esercitazione >  >> Linux

Problemi con le espressioni regolari in Bash:[^negate] non sembra funzionare

Sei sicuro che ciò che desideri stia accadendo? Quando esegui ls /directory | grep '[^term]' stai essenzialmente grepping per non le lettere t e r m. Questo significa che se un file ha altre lettere nel suo nome apparirà comunque nell'output di ls . Prendi ad esempio la seguente directory:

$ ls
alpha  brave  bravo  charlie  delta

Ora se eseguo ls |grep '^[brav]' Ottengo quanto segue:

$ ls |grep '^[brav]'
alpha
brave
bravo

Come puoi vedere, non solo ho ottenuto brave e bravo Ho anche ricevuto alpha perché la classe di caratteri [] riceverà qualsiasi lettera da quella lista.

Di conseguenza, se eseguo ls |grep '[^brav]' Otterrò tutti i file che non contengono i caratteri b r a v ovunque nel nome.

$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta

Se noti che includeva l'intero elenco di directory perché tutti i file ne avevano almeno uno lettera che non era inclusa nella classe di caratteri.

Quindi, come ha detto Kanvuanza, grep per l'inverso di "termine" rispetto ai caratteri t e r m dovresti farlo usando grep -v .

Ad esempio:

$ ls |grep -v 'brav'
alpha
charlie
delta

Inoltre, se non vuoi che i file contengano caratteri nella classe, usa grep -v '[term]' . Ciò impedirà la visualizzazione di qualsiasi file che abbia uno di quei caratteri. (risposta di Kanvuanza)

Ad esempio:

$ ls |grep -v '[brav]'

Come puoi vedere non c'erano file elencati perché tutti i file in questa directory includevano almeno una lettera di quella classe.

Appendice:

Volevo aggiungere che usando PCRE è possibile usare solo regex per filtrare usando espressioni negate. Per fare questo useresti qualcosa noto come regex look-ahead negativo:(?!<regex>) .

Quindi, usando l'esempio sopra, puoi fare qualcosa di simile per ottenere i risultati desiderati senza usare grep flag.

$ ls | grep -P '^(?!brav)'
alpha
charlie
delta

Per decostruire quella regex, prima corrisponde all'inizio di una riga ^ e quindi cerca le stringhe che non corrispondono a brav da seguire dopo. Solo alpha , charlie e delta match quindi quelli sono gli unici che vengono stampati.


Immagino che grep -v flag fa quello che vuoi. Dalla pagina man:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines.

Puoi usare ls /directory | grep -v [term] per stampare tutte le righe non corrispondenti.


Linux
  1. Espressioni regolari:mettere tutto insieme

  2. Bash + Verifica nome tramite espressione regolare?

  3. Bash:espressioni regolari in sostituzione?

  4. LD_LIBRARY_PATH non sembra funzionare

  5. Perché "\d" non funziona nelle espressioni regolari in sed?

Espressione sequenza Bash (intervallo)

Espressioni regolari in Grep (Regex)

eclipse/tomcat:il deploy non funziona più (ClassNotFoundException)

chmod non funziona

Espressione regolare per trovare caratteri doppi in Bash

Espressione regolare con sed