Назад | Перейти на главную страницу

Не работает регулярное выражение для домена с дефисами

У меня есть умный скрипт, который проверяет имя сервера и получает доменное имя. Например, у меня есть имя сервера: example.ru01. Мне нужно получить: example.ru Мой scipt:

#!/bin/bash

hostname=example.com01
echo $hostname
reg0="\(\(\w*\.[a-z]*\)\|\(\w*\.[a-z]*\.[a-z]*\)\)"
domain=`expr match $hostname $reg0`
echo $domain

Все в порядке. на выходе у меня есть:

example.com01
example.com

Но в моей инфраструктуре есть домены с дефисами. Например: test-test.com01. Но в моем сценарии это не работает. Как решить эту проблему? Пожалуйста помоги. Я внес некоторые изменения в свое регулярное выражение, например:

\(\(\w*\.[a-z_-]*\)\|\(\w*\.[a-z_-]*\.[a-z_-]*\)\)

Но не работает. Где у меня ошибка? Пожалуйста помоги. Спасибо за внимание.

Если числа встречаются только в конце ваших имен хостов, вы также можете просто удалить все числа с конца. Который, как мне кажется, легче читать и поддерживать.

hostname=example.com01
echo $hostname
domain=$(echo $hostname | sed -e 's/[0-9]*$//g')
echo domain

Проблема с вашим регулярным выражением заключается в том, что вы говорите ему, что оно должно сначала соответствовать вашей строке с количеством от нуля до бесконечности \w который «Соответствует любому символу слова, включая подчеркивание», за которым следует буквальная точка .. (\w*\.)

в случае test-test.com01 он не совпадает из-за дефиса, поэтому, если вы измените его на соответствие, - тогда он будет работать так, как вы хотите:

\(\([a-z_-]*\.[a-z_-]*\)\|\([a-z_]*\.[a-z_-]*\.[a-z_-]*\)\)
      ^ replace \w            ^ replace \w

Есть несколько способов улучшить это регулярное выражение, но ИМО, количество времени, которое вы должны потратить на создание хорошего, пропорционально сложности текста, который вы анализируете.