複数のオプションで構成される文字列があります。値は | で区切られます。
オプション: 値は、次の 2 つのいずれかです。
[[:alnum:]]{3}:all
[[:alnum:]]{3}:FQDN
ここで、FQDN はホストの DNS 名です。
たとえば、
647:all|1bc:all|d1f:all|vf4:www.host.com|vk4:all|k22:www.another.com|bbd:all|opo:all
この文字列がルールと一致するかどうかをテストするために正規表現をどのように書くことができますか?
答え1
647:all|1bc:all|d1f:all|...
文字列の形式が正しく、上記のパターンと一致する部分が含まれているかどうかをテストしますか?
ドメイン名をどれだけ厳密に一致させるかによって、これらのいくつかは(EREでは)次のようになります。
[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+)
|
- で区切られた複数のコピーを含む完全な行もあります。
^[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+)(\|[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+))*$
abcd
これにより、実際に正規化または有効な名前でなくても、ドメイン名または同じものを使用できます。foo..bar
より厳格なテストのために、ドメイン名部分は次のようになります。[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+\.?
1つの大きな正規表現を使用する前に、文字列を分割して部分を個別にテストする方が良いかもしれません。
次のようにすると、目的のパターンと一致しない要素が印刷されます。
$ perl -lne 'chomp; for $a (split/\|/) {
print "mismatch: $a" if $a !~ /^[[:alnum:]]{3}:(all|[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+\.?)$/;
}' <<< '123:all|456:abcd|789:foo..bar|999:www.host.com'
mismatch: 456:abcd
mismatch: 789:foo..bar
答え2
次のステップ2パイプラインは文字列のすべての部分を印刷します。いいえ質問の基準を満たしてください。
tr '|' '\n'| sed -r -n '/^[[:alnum:]]{3}:[[:alnum:].]{1,}$/!p'
これはFQDNに対して非常に緩和された/緩和された表現を使用します。つまり、、、および、およびの英数字の集合[[:alnum:]._-]{1,}
(FQDNが「有効」を意味する)です。.
_
-
---
パイプは文字列を区切り文字に従って複数行に分割し|
、sed
式は与えられた正規表現(!p
「一致しない場合は印刷」)と一致しない行を印刷します。