Это нелогично, но в большинстве регулярных выражений Unix экранирование |
делает его оператором or. Таким образом, ваша строка на самом деле соответствует «ничего или ничего» (вы можете проверить это, добавив несколько альтернатив с обеих сторон). Просто используйте
grep -c "|" *.*
Во-вторых, grep считает строки, а не вхождения символов. Вы можете использовать другой инструмент; или, если вы настаиваете на grep, вы можете поставить каждый "|" на своей собственной линии. Например, с помощью sed:
sed 's/|/|\n/g' *.*
Примечание: если вы используете sed, я советую lot тестирования, чтобы убедиться, что он делает то, что вы думаете, что он делает. Мне нужно было именно тогда.
Наконец, объедините ингредиенты:
cat *.* | sed 's/|/|\n/g' | grep -c "|"
К сожалению, это может не сработать, поскольку вы, вероятно, не используете unix (из-за *.*
). Но, надеюсь, это объясняет проблему, которую я всегда нахожу странно обнадеживающей.