Strano comportamento di "ls -a | grep ^ \. "


10

Volevo elencare il contenuto di un pwd e visualizzare solo il file che inizia con il punto. Ho provato ls -a | grep ^\.ma non riesco a capire perché l'output contenga anche i file che non iniziano con il punto. Per esempio:

Pictures
.pip
.pki
.profile
projects
Public

So che posso ottenere ciò che voglio con ls -ld .*Sono solo curioso di questo comportamento di grep che non posso spiegare.



Perché non ls -d .*elencare tutti i file che iniziano con .?
Barmar

Nota di avviso: non convogliare mai l'output di ls in un altro comando. Usa invece trova. Ha troppe ideosincrasie di cui ci si può fidare. Vedi: Pitfall 1 su mywiki.wooledge.org/BashPitfalls - è diventato il numero 1! Anche il resto del sito è fantastico.
Joe,

Risposte:


20

Cita l'argomento a grep, quindils -a | grep '^\.'

La ragione di ciò è che la shell la gestisce \.e la trasforma in semplice ., che grepquindi considera un carattere jolly a carattere singolo. In caso di dubbio, citare sempre una stringa che contiene (o potrebbe contenere) un carattere speciale per la shell.


Perché la shell ignora \?
ps-aux,

\ è una sequenza di escape che fa in modo che la shell tratti letteralmente il seguente carattere. In questo grep ^\\., \\ viene trattato dalla shell come una singola barra rovesciata e, di nuovo, grep tratta la singola barra rovesciata seguita dal punto come punto letterale.
Avinash Raj,

11

Devi inserire la regex grep tra virgolette.

ls -a | grep '^\.'

Nota: non analizzare l'output del lscomando .


Perché è male analizzare l'output di ls?
ps-aux,

Dal collegamento: nella sua modalità predefinita, se l'output standard non è un terminale, ls separa i nomi dei file con nuove righe. Questo va bene fino a quando non hai un file con una nuova riga nel suo nome.
Michael Durrant,

@Michael Durrant: suggerirei che consentire nuove righe nei nomi dei file sia un grave bug di sistema.
jamesqf,

@jamesqf - vedi le nuove righe nei nomi dei file (specialmente la risposta di sml ).
don_crissti,

0

Se si esegue cmd ls -a | grep ^ \. quindi grep non considera "\" come un carattere speciale e un significato di "." non fuggire.

Quando usiamo cmd ls -a | grep "^ \." quindi grep considera "\" come carattere speciale e significato di "." viene evaso. Ti darà un risultato come previsto.

Se vuoi usare grep cmd senza virgolette, dovresti sfuggire anche al carattere "\". Puoi avere un risultato atteso senza virgolette doppie seguendo il comando. ls -a | grep ^ \\.

Per dettagli sul significato di caratteri speciali in Regex, consultare il seguente link. http://www.regular-expressions.info/quickstart.html

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.