linee grep che iniziano con "1" in Ubuntu


47

Provo a cercare le righe che iniziano con "1" utilizzando

ls -1 | grep ^1*

ma restituisce righe che non iniziano con 1. Cosa mi manca qui?


Solo un'altra nota: se si desidera utilizzare grep per limitare l' lsoutput, si verificheranno problemi se i nomi dei file contengono caratteri strani, come le nuove righe ... Molti altri comandi (in qualche modo no ls, almeno non la versione che devo controllare) avere un'opzione per fornire un output separato nullo, che può quindi essere elaborato in modo sicurogrep -z
Gert van den Berg,

Grazie, @GertvandenBerg! Quali problemi possono causare alcuni personaggi strani come newline? Quali comandi forniscono un output separato nullo?
Tim

1
trova con -print0, la maggior parte degli altri strumenti GNU ha un'opzione -0 o -z. (ordinamento, xargs, ecc.). Se i nomi dei file contengono nuove righe, sarebbe impossibile sapere se due righe sono un nome di file contenente una nuova riga o due nomi di file separati.
Gert van den Berg,

Risposte:


68

La tua espressione regolare non significa ciò che pensi che faccia. Corrisponde a tutte le righe che iniziano (^) con uno (1) ripetuto zero o più (*) volte. Tutte le stringhe corrispondono a quell'espressione regolare. grep '^1'fa quello che vuoi.


33

Hai provato quanto segue?

 ls -1 | grep "^1"

Cioè, rimuovere il *, che sostanzialmente dice grep, trovare zero o più occorrenze ^1dell'espressione. In altre parole: abbina le linee che iniziano con 1 o no.


13

Anche se questo non risponde alla tua domanda, questa è una soluzione migliore a quello che sembra essere il tuo obiettivo:

ls -ld 1*

È possibile utilizzare un shell glob per elencare tutti i file che iniziano con 1. Si noti che *ha un significato diverso nel globbing della shell rispetto alle espressioni regolari.


Grazie! +1. In che modo * ha un significato diverso nel shell globbing e nelle espressioni regolari?
Tim

2
In una shell glob * è un carattere jolly che significa "0 o più di qualsiasi carattere". Il significato di regex è spiegato nella risposta di otokan.
Giordania,

3

^ 1. * corrisponde all'intera riga, o proprio come detto sopra, ^ 1 ha ottenuto la stringa contenuta nella riga.

stili diversi di regex usano simboli diversi che rappresentano i caratteri, alcune opzioni specificano lo stile che desideri. e diverse opzioni specificano se si desidera abbinare l'intera riga, o solo parte di essa, o l'intero input come una stringa.

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.