2016-12-03 9 views
-1

スマートスクリプトがあり、サーバーの名前を確認してドメイン名を取得しています。たとえば、私はserver: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 

それはokです。出力では、私は持っています:

example.com01 
example.com 

しかし、私のインフラストラクチャでは、私はハイフンを持ついくつかのドメインがあります。例:test-test.com01。しかし、私のスクリプトではうまくいきません。この問題を解決するには?助けてください。

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

私は正規表現でいくつかの変更を加えましたが、これは機能しません。どこにエラーがありますか?助けてください。ご注意いただきありがとうございます。あなたは正しい軌道に乗っている

+0

「01」を削除しようとしていますか? – dawg

+1

ドメイン名にアンダースコア '_'をつけることはできません。 – e0k

+0

' reg0 = "\ w * \([.-] \ w * \)\ +" 'または' reg0 = "\ w \ ([.-] \ w \ + \)\ '" –

答えて

0

、あなたが持っていた小さな問題は、このような.com.netまたは.ruとしてドメインの最後の部分をマッチングする責任がある正規表現の一部に-を追加したことです。代わりに、-を正規表現の最初の部分に追加する必要があります。これは動作するはずです:

req0="\(\(\[a-z0-9_-]*\.[a-z]*\)\|\([a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]*\)\)" 

この正規表現​​は、このトークン\w使用して短縮することができ、それは問題なく動作します。しかし、このトークン\wは、bashの[]の内部では機能していないようですので、-を追加するために​​を使用しました。

0

はい、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(0回以上)を必要としていることで、ドット\.

実際にあなたが書いたのは「単語」\wです。この場合、一致させたいものが「www」である場合は、バックスラッシュを削除する必要があります。

また、アンダースコアはドメイン名で正しくありません。これは、あなたが使うべき正しい正規表現です:

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

www.は、必要に応じて、その後、1または(オプションで)一致している間に点を持つ2人の名前。 www.1and1.com

をそして、実際には、気をつけろ!!:

しかし、ドメイン名は、数字を含めることができますRFC 6531のセクション3.3から

:今、彼らは任意の有効なUTF-8文字列が含まれている可能性が

の定義はRFC 5321の定義およびDNSラベルでUTF-8文字列の両方を許可するように拡張されますそれは にIDNA定義[RFC5890]を準拠させます。

そしてRFC 5890

"Uラベル" のセクション2.3.2.1は、IDNA-有効 正規化形式C(NFC)のUnicode文字の文字列、および少なくとも一つの非などでありますASCII 文字で、標準のUnicodeエンコーディング形式( UTF-8など)で表されます。

関連する問題