Вам не хватает нескольких других правил синтаксиса. В рамках расширения в скобках, кроме простых диапазонов, есть также несколько типов многосимвольных выражений, которые начинаются с [
. (См. Руководство regex (7) для Linux или FreeBSD по адресу «За исключением этих и некоторых комбинаций, использующих« [» (см. Следующие абзацы)».) Это:
- Элементы сортировки:
[.
….]
- Классы эквивалентности:
[=
…=]
- Классы персонажей:
[:
…:]
(Возможно, вы видели или использовали такие выражения как [[:digit:]]
- это на самом деле класс символов, [:digit:]
который оказался единственным элементом […]
расширения в скобках.)
Так что в вашем случае, поскольку .
происходит сразу после a [
, они распознаются как начальный разделитель элемента сортировки. GNU grep 3.1 имеет правильное сообщение об ошибке:
$ printf 'abcde.fgh' | grep -iEq '^[^][.$^*_-]' grep: Unmatched [, [^, [:, [., or [=
Одни и те же выражения можно использовать для выхода из таких ситуаций, например, используя [...]
или [=.=]
для включения обычной точки, или аналогично, [=-=]
чтобы соответствовать тире, если их некуда переместить.