带连字符的域名的正则表达式不起作用

带连字符的域名的正则表达式不起作用

我有一些智能脚本,用于检查服务器名称并获取域名。例如,我有服务器名称:example.ru01。我需要获取:example.ru 我的脚本:

#!/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_-]*\)\)

但它不起作用。我哪里出错了?请帮忙。感谢您的关注。

答案1

您的正则表达式的问题在于您告诉它必须首先将您的字符串与零到无穷大的数量进行匹配,其中\w“匹配任何单词字符(包括下划线)”,后跟一个文字点.。(\w*\.

在这种情况下,test-test.com01由于连字符,它不匹配,所以如果您将其更改为匹配,那么-它将按照您希望的方式工作:

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

有几种方法可以改进这个正则表达式,但在我看来,你应该花在制作一个好的正则表达式上的时间与你解析的文本的复杂性成正比。

答案2

如果数字仅出现在主机名的末尾,您也可以删除末尾的所有数字。我认为这更易于阅读和维护。

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

相关内容