У меня есть умный скрипт, который проверяет имя сервера и получает доменное имя. Например, у меня есть имя сервера: 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
Есть несколько способов улучшить это регулярное выражение, но ИМО, количество времени, которое вы должны потратить на создание хорошего, пропорционально сложности текста, который вы анализируете.