对于带有连字符

时间:2016-12-03 19:16:59

标签: regex linux bash sh

我有一些智能脚本,它检查服务器的名称并获取域名。例如,我有服务器的名称: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_-]*\)\)

但它不起作用。哪里有错误?请帮忙。谢谢你的关注。

2 个答案:

答案 0 :(得分:1)

是的,test-test.com01将不匹配。

但是,www.test-test.com01会:

$ hostname="www.test-test.com01"
$ reg0="\(\(\w*\.[a-z_-]*\)\|\(\w*\.[a-z_-]*\.[a-z_-]*\)\)"
$ expr match $hostname $reg0
www.test-test.com

问题是您需要一个可选的w(零次或多次)和一个点\.

嗯,实际上,你写的是“一个单词”\w,在这种情况下,你应该删除反斜杠,如果你想要匹配的是“www”。

此外,域名中的下划线不正确。这是你应该使用的正确的正则表达式:

reg0="\(\(w\{1,3\}\.\)\?[a-z-]\+\(\.[a-z-]*\)\?\)"

在这一个中,www.可选地匹配,然后是一个或(可选)两个名称,中间有一个点。

但是,域名可以包含数字:www.1and1.com

事实上,小心!!现在它们可以包含任何有效的UTF-8字符串:

来自RFC 6531的第3.3节:

  

扩展的定义允许RFC         5321定义和符合DNS标签的UTF-8字符串         与IDNA定义[RFC5890]。

RFC 5890

的第2.3.2.1节
  

“U-label”是一个IDNA有效的Unicode字符串,在         归一化形式C(NFC)并且包括至少一个非ASCII         字符,以标准Unicode编码格式表示(例如         UTF-8)。

答案 1 :(得分:0)

您走在正确的轨道上,您遇到的一个小问题是您将-添加到负责匹配域的最后部分的正则表达部分,例如.com,{ {1}}或.net。相反,您应该将.ru添加到正则表达式的第一部分。这应该有效:

-

可以使用此令牌req0="\(\(\[a-z0-9_-]*\.[a-z]*\)\|\([a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]*\)\)" 缩短此正则表达式[a-z0-9_],并且它可以正常运行。但是,此标记\w似乎无法在bash中的\w内运行,因此,我使用[]来添加[a-z0-9_]