Le grep
code le plus simple qui fonctionnera:
grep -xE '([^,]*,){10}[^,]*'
Explication:
-x
garantit que le motif doit correspondre à la ligne entière , plutôt qu'à une partie seulement. Ceci est important pour ne pas faire correspondre les lignes avec plus de 10 virgules.
-E
signifie "regex étendu", ce qui permet de réduire l'échappement anti-slash dans votre regex.
Les parenthèses sont utilisées pour le regroupement, ce qui {10}
signifie par la suite qu'il doit y avoir exactement dix correspondances dans une rangée du motif dans les parenthèses.
[^,]
est une classe de caractères — par exemple, [c-f]
correspondrait à n'importe quel caractère unique qui est a c
, a d
, an e
ou an f
, et [^A-Z]
correspondrait à tout caractère unique qui n'est PAS une lettre majuscule. Correspond donc à [^,]
n'importe quel caractère, à l'exception d'une virgule.
L' *
après la classe de caractères signifie «zéro ou plusieurs d'entre eux».
Ainsi, la partie regex ([^,]*,)
signifie "N'importe quel caractère sauf une virgule un certain nombre de fois (y compris zéro fois), suivi d'une virgule" et le {10}
spécifie 10 d'entre eux. Ensuite, [^,]*
pour faire correspondre le reste des caractères non virgule à la fin de la ligne.
sed
cas ici) seulement jusqu'à une correspondance de plus que ce qui est recherché, bien que cette question le fasse. Vous ne devriez pas avoir fermé cela.