Il grep
codice più semplice che funzionerà:
grep -xE '([^,]*,){10}[^,]*'
Spiegazione:
-x
assicura che il motivo deve corrispondere all'intera linea, anziché solo a una parte di essa. Questo è importante quindi non abbinare le righe con più di 10 virgole.
-E
significa "regex esteso", il che rende meno backslash-escape nel tuo regex.
Le parentesi vengono utilizzate per il raggruppamento e, {10}
successivamente, significa che devono esserci esattamente dieci corrispondenze in una riga del modello all'interno delle parentesi.
[^,]
è una classe di caratteri: ad esempio, [c-f]
corrisponderebbe a qualsiasi singolo carattere che è un c
, a d
, an e
o an f
e [^A-Z]
corrisponderebbe a qualsiasi singolo carattere che NON sia una lettera maiuscola. Quindi [^,]
corrisponde a qualsiasi singolo carattere tranne una virgola.
Il *
dopo la classe di caratteri significa "zero o più di questi".
Quindi la parte regex ([^,]*,)
significa "Qualsiasi carattere tranne una virgola un numero qualsiasi di volte (incluso zero volte), seguito da una virgola" e ne {10}
specifica 10. Quindi [^,]*
abbinare il resto dei caratteri non virgola alla fine della riga.
sed
fa qui) solo per quanto riguarda una corrispondenza in più di quanto si cerchi, anche se questa domanda lo fa. Non avresti dovuto chiudere questo.