Использование FreeBSD 11.1:
#!/bin/sh
if printf 'abcde.fgh' | grep -iEq '^[^][$^*_-]'; then
echo "test 1 success"
else
echo "test 1 fail"
fi
echo
if printf 'abcde.fgh' | grep -iEq '^[^][.$^*_-]'; then
echo "test 2 success"
else
echo "test 2 fail"
fi
Выход:
test 1 success
grep: Unmatched [ or [^
test 2 fail
Но AFAICT это должно дать тот же результат. Они оба содержат условие для первого символа (только), что оно не входит в список указанных не алфавитных символов. Разбивка регулярного выражения:
^
= начало строки[^...]
= соответствует, если ни один из этих символов- В списке
]
должен быть первым символом,^
не должен быть первым и - должен быть последним. Итак][.^$_-
это допустимый список буквенных символов, и строка не должна совпадать ни с одним из них. - Чтобы избежать путаницы, обратите внимание, что это означает, что символы
][
являются буквенными символами"]"
и"["
, а не закрытием из двух списков.
Единственная разница между двумя выражениями - это "."
но он находится внутри списка, поэтому его следует рассматривать как not literal .
и действительно, первый символ не соответствует буквальному значению "."
Что мне не хватает? Что-то очень очевидное и простое, наверное?