Utilizzando la stella accedi a grep

Sto cercando di cercare la sottostringa “abc” in un file specifico in linux / bash

Faccio così:

grep '*abc*' myFile 

Non restituisce nulla.

Ma se lo faccio:

 grep 'abc' myFile 

Restituisce le corrispondenze correttamente.

Ora, questo non è un problema per me. Ma cosa succede se voglio grep per una stringa più complessa, ad esempio

 *abc * def * 

Come potrei realizzarlo usando grep?

L’asterisco è solo un operatore di ripetizione , ma devi dirgli cosa ripeti. /*abc*/ corrisponde a una stringa contenente ab e zero o più c (poiché il secondo * è sul c, il primo non ha senso perché non c’è nulla da ripetere). Se vuoi abbinare qualcosa, devi dire .* – il punto indica qualsiasi carattere ( all’interno di determinate linee guida ). Se vuoi semplicemente abbinare abc, potresti semplicemente dire grep 'abc' myFile . Per la tua partita più complessa, devi usare .*grep 'abc.*def' myFile con una stringa che contiene abc seguita da def con qualcosa opzionalmente in mezzo.

Aggiornamento basato su un commento:

* in un’espressione regolare non è esattamente uguale a * nella console. Nella console, * fa parte di un costrutto glob e agisce semplicemente come un jolly (ad esempio ls *.log elencherà tutti i file che terminano in .log). Tuttavia, nelle espressioni regolari, * è un modificatore, il che significa che si applica solo al personaggio o al gruppo che lo precede. Se si desidera * nelle espressioni regolari agire come un jolly, è necessario utilizzare .* Come precedentemente menzionato: il punto è un carattere jolly e la stella, quando si modifica il punto, significa trovare uno o più punti; vale a dire. trova uno o più personaggi.

Il carattere punto corrisponde a qualsiasi carattere, quindi ‘. *’ Significa zero o più occorrenze di qualsiasi carattere. Probabilmente vuoi usare ‘. *’ Piuttosto che solo ‘*’.

Ah, merda,

Il “segno zodiacale” è significativo solo se c’è qualcosa di fronte ad esso. Se non c’è lo strumento (in questo caso grep) potrebbe trattarlo come un errore. Per esempio:

 '*xyz' is meaningless 'a*xyz' means zero or more occurrences of 'a' followed by xyz 

L’espressione che hai provato, come quelli che funzionano sulla riga di comando della shell in Linux, per esempio, è chiamata ” glob “. Le espressioni Glob non sono espressioni regolari complete, che è ciò che grep usa per specificare le stringhe da cercare. Ecco (vecchio, piccolo) post sulle differenze. Le espressioni glob (come in “ls *”) sono interpretate dalla shell stessa.

È ansible tradurre da glob a RE, ma in genere è necessario farlo in testa.

Non stai usando le espressioni regolari, quindi la tua variante di grep di scelta dovrebbe essere fgrep , che si comporterà come ci si aspetta.

Prova grep -E per il supporto esteso alle espressioni regolari

Dai anche un’occhiata a:

La pagina man di grep

Usa grep -P – che abilita il supporto per le espressioni regolari in stile Perl.

 grep -P "abc.*def" myfile 

Questa potrebbe essere la risposta che stai cercando:

 grep abc MyFile | grep def 

L’unica cosa è … emetterà le linee “def” prima O dopo “abc”

‘*’ funziona come un modificatore per l’elemento precedente. Quindi ‘abc * def’ cerca ‘ab’ seguito da 0 o più ‘c’ seguito da ‘def’.

Quello che probabilmente vorrai è ‘abc. * Def’ che cerca ‘abc’ seguito da un numero qualsiasi di caratteri, seguito da ‘def’.