Ces deux commandes font en effet des choses différentes, et aucun d'eux ne fait ce que vous pensez:
grep -c [^[^aeiouAEIOU]] filename.txt
Vous ne pouvez pas vraiment nid [^...]
expressions . Au lieu de cela, cette expression régulière est interprétée comme [^[^aeiouAEIOU]
concaténée avec ]
. C'est-à-dire, il va correspondre n'importe où dans la ligne toute combinaison d'un caractère qui n'est pas [
, ^
, ou une voyelle, et ]
. Par exemple, ces chaînes correspondent: b]
, c]
, #]
, ;]
; et ceux-ci ne vont pas: a]
, E]
, c
, d
. Et « sur la première ligne » signifie que la commande ci-dessus grep
comptera des lignes telles que aaab]
, i uc]
, etc.
Quant à votre deuxième commande,
grep -v -c [^aeiouAEIOU] filename.txt
Ici vous avez la double négation. Tout d'abord, [^aeiouAEIOU]
correspond à n'importe quel caractère autre qu'une voyelle. D'autre part, l'option -v
transmise à grep
inverse la correspondance, de sorte qu'elle correspond à toutes les lignes qui ne correspondent pas à [^aeiouAEIOU]
. L'effet final est, fondamentalement, que vous dites grep
: "Comptez toutes les lignes qui n'ont pas de symboles autres que aeiouAEIOU
". C'est-à-dire, il ne comptera que les lignes qui ne contiennent que des voyelles.
Deux commandes qui fait devrait vous donner le nombre de lignes qui ne commencent pas par une voyelle sont:
grep -c ^[^aeiouAEIOU] filename.txt
grep -v -c ^[aeiouAEIOU] filename.txt