У меня есть умный скрипт, который проверяет имя сервера и получает доменное имя. Например, у меня есть имя сервера: example.ru01. Мне нужно получить: example.ru Мой scipt:
#!/bin/bash
hostname=example.com01
echo $hostname
reg0="\(\([a-z0-9_-]*\)\|\([a-z0-9_-]*\.[a-z_-]*\)\)"
domain=`expr match $hostname $reg0`
echo $domain
Все в порядке. на выходе у меня есть:
example.com01
example.com
Но когда я пишу домен третьего уровня, у меня получается:
example.com.us01
example.com
Итак, мне нужно еще одно регулярное выражение. Я написал это:
reg0="\(\([a-z0-9_-]*\)\|\([a-z0-9_-]*\.[a-z0-9_-]*\.[a-z_-]*\)\)"
Вывод:
example.com.us01
example.com.us
Оно работает. Но когда я пишу домен второго уровня, у меня получается:
example.com01
example
Итак ... Могу ли я написать регулярное выражение для двух типов домена?
Это похоже на вопрос домашнего задания.
Как насчет использования * в круглых скобках?
subdomain\.(domain)*
Или, как насчет того, чтобы просто удалить последние цифры?
(.*)[0-9][0-9]
Вам нужно быть более конкретным; вам нужно проверить ввод?
Я считаю, что вы можете решить свою проблему с помощью этого кода:
#!/bin/bash
hostname=test.example.com01 #or example.com01 or foo.test.example.com01
echo $hostname
reg0='^.*\.\([a-z0-9_-]*\.[a-z_-]*\)[0-9]*$'
reg1='^\([a-z0-9_-]*\.[a-z_-]*\)[0-9]*$'
domain=`expr "$hostname" : "$reg0" '|' "$hostname" : "$reg1"`
echo $domain
Позволь мне объяснить: expr STRING:REGEX
будет делать то же самое, что и expr match
. В |
в середине означает: если "$hostname" : "$reg0"
пустая попытка "$hostname" : "$reg1"
. Регулярные выражения неявно начинаются с ^, как сказано в документации coreutils, а возвращаемая строка - это та, которая находится внутри \(
и \)
.
Помни это *
жаден и старается подбирать все как можно дольше.
Сказано, что программа начинается с reg0, которые соответствуют всем доменам третьего, четвертого и т. Д. Уровня ... но не могут соответствовать example.com01 из-за первой точки. Если $hostname
это не домен третьего уровня или более $reg0
верните null, и теперь идет reg1, который соответствует доменам в стиле example.com01.
Я попробовал программу и вроде все работает так, как вы хотите.