Использовать регулярное выражение с дефисом и точкой

#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