#regex #bash #shell
#регулярное выражение #bash #оболочка
Вопрос:
Я пытаюсь сопоставить имя хоста с регулярным выражением. По какой-то причине следующий код завершается с ошибкой.
#!/bin/bash
CONFIGURATION=m1si-ngxi-ddb01
#check configuration format
TMP_CONFIGURATION=",${CONFIGURATION}"
re=',[a-zA-Z0-9-_.] '
if ! [[ $TMP_CONFIGURATION =~ $re ]]
then
echo "configuration parttern mismatch."
exit 1
fi
Тестирование:
[oracle@m1s-nyyy-db01 nir]$ vi a.sh
[oracle@m1s-nyyy-db01 nir]$
Комментарии:
1. Использовать
re=',[a-zA-Z0-9_.-] '
2. Обратите внимание, что вы можете заменить
[a-zA-Z0-9]
на[[:alnum:]]
.
Ответ №1:
Ваш шаблон не работает из-за «экранированных» символов и того факта, что -
он не находится в конце / начале выражения в скобках.
Всегда обрабатывается как буквенная обратная косая черта внутри выражений в скобках, они не образуют никаких escape-последовательностей. Дефис сложный, смотрите Выражение 9.3.5 о замене скобок, пункт 7:
<hyphen-minus>
Символ должен обрабатываться как сам по себе, если он встречается первым (после начального ‘^’, если таковой имеется) или последним в списке, или как конечная точка диапазона в выражении диапазона.
Использовать
CONFIGURATION=m1si-ngxi-ddb01
#check configuration format
TMP_CONFIGURATION=",$CONFIGURATION"
re=',[a-zA-Z0-9_.-] '
if ! [[ $TMP_CONFIGURATION =~ $re ]]
then
echo "configuration parttern mismatch."
exit 1
fi
Посмотрите онлайн-демонстрацию. Обратите внимание, что нет необходимости заключать CONFIGURATION
в фигурные скобки, $CONFIGURATION
= ${CONFIGURATION}
.
Комментарии:
1.
,[a-zA-Z0-9_-]
также не будет соответствовать,m1si-ngxi-ddb01
?2.@User123 Оно будет совпадать
,m1si-ngxi-ddb01
, но оно также будет совпадать,m1si-ngxi-ddb01