Il semble que vous fassiez vos devoirs aujourd'hui...
Une solution :
grep -c "\([',]\|^$\)" filename
Si par ligne vide vous souhaitez également inclure ceux qui ne contiennent que des espaces :
grep -c "\([',]\|^[[:space:]]*$\)" filename
L'astuce pour les apostrophes consiste à utiliser des guillemets doubles, sinon '''
sera une erreur. La construction \( regexp1 \| regexp2 \)
correspondra à toutes les lignes qui correspondent à l'un ou l'autre des éléments suivants regexp1
o regexp2
. L'expression rationnelle [',]
correspond à toutes les lignes qui contiennent un guillemet '
ou un coma ,
.
Ici, vous devez échapper aux parenthèses ()
et le tuyau |
autrement grep essaie de trouver ces caractères, et ne les considère pas comme des constructions d'expressions rationnelles. Si vous n'aimez pas les échapper, vous pouvez utiliser l'option -E
(pour les expressions rationnelles étendues) ou egrep directement comme :
grep -cE "([',]|^$)" filename
または
egrep -c "([',]|^$)" filename
Dans votre OP, vous mentionnez le -x
d'aiguillage. Cela fonctionne pour obtenir des lignes vides... mais ne fonctionnera pas avec votre exigence en matière de virgules et de guillemets. Donc, pour faire correspondre une ligne vide, j'utilise ^$
( ^
est une ancre pour le début de la ligne et $
est une ancre pour la fin de ligne).
J'espère que cela vous aidera.