用连字符正则expression第二和第三个域级别

我有一些聪明的脚本,检查服务器的名称,并获得域名。 例如,我有服务器的名称: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 

所以,我需要另一个正则expression式。 我写了这个:

 reg0="\(\([a-z0-9_-]*\)\|\([a-z0-9_-]*\.[a-z0-9_-]*\.[a-z_-]*\)\)" 

输出:

 example.com.us01 example.com.us 

有用。 但是,当我写第二层域,我有输出:

 example.com01 example 

所以…我可以写一个正则expression式两种types的域?

这看起来像一个家庭作业问题。

用括号括起来怎么样?

 subdomain\.(domain)* 

或者,如何简单地剥离最后的数字?

 (.*)[0-9][0-9] 

你需要更加详细; 你需要validationinput吗?

我相信你可以用这个代码解决你的问题:

 #!/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" 。 正则expression式隐式地以^作为coreutils所说的文档开头,返回的string是\(\)

请记住, *是贪婪的,尽量匹配所有事物。

这样说,程序从reg0开始,匹配所有的第三级,第四级等域名,但是由于第一个点而不能匹配example.com01。 如果$hostname不是第三级域名或更多$reg0返回null,现在$reg0匹配example.com01样式的域名。

我已经尝试了程序,一切似乎都以你想要的方式工作。