Adam Davis'in doğru cevabına ek olarak , bu operasyon için kendi çözümümü yayınlamak istiyorum.
Liste büyük bir şey olduğu için, test edilen birçok farklı çözümden üçü var ...
Öncelikle TLD Listenizi şu şekilde hazırlayın:
wget -O - https://publicsuffix.org/list/public_suffix_list.dat |
grep '^[^/]' |
tac > tld-list.txt
Not: tac
daha .co.uk
önce test edilmesini sağlamak için listeyi ters çevirecektir .uk
.
Posix kabuk versiyonu
splitDom() {
local tld
while read tld;do
[ -z "${1##*.$tld}" ] &&
printf "%s : %s\n" $tld ${1%.$tld} && return
done <tld-list.txt
}
Testler:
splitDom super.duper.domain.co.uk
co.uk : super.duper.domain
splitDom super.duper.domain.com
com : super.duper.domain
bash versiyon
Çatalları azaltmak ( myvar=$(function..)
sözdiziminden kaçınmak ) için, bash işlevlerinde dump çıktısını stdout olarak ayarlamak yerine değişkenleri ayarlamayı tercih ederim:
tlds=($(<tld-list.txt))
splitDom() {
local tld
local -n result=${2:-domsplit}
for tld in ${tlds[@]};do
[ -z "${1##*.$tld}" ] &&
result=($tld ${1%.$tld}) && return
done
}
Sonra:
splitDom super.duper.domain.co.uk myvar
declare -p myvar
declare -a myvar=([0]="co.uk" [1]="super.duper.domain")
splitDom super.duper.domain.com
declare -p domsplit
declare -a domsplit=([0]="com" [1]="super.duper.domain")
Daha hızlı bash versiyon:
Aynı hazırlıkla, o zaman:
declare -A TLDS='()'
while read tld ;do
if [ "${tld##*.}" = "$tld" ];then
TLDS[${tld##*.}]+="$tld"
else
TLDS[${tld##*.}]+="$tld|"
fi
done <tld-list.txt
Bu adım önemli ölçüde daha yavaştır, ancak splitDom
işlev çok daha hızlı hale gelecektir:
shopt -s extglob
splitDom() {
local domsub=${1%%.*(${TLDS[${1##*.}]%\|})}
local -n result=${2:-domsplit}
result=(${1#$domsub.} $domsub)
}
Ahududu pi'mdeki testler:
Her ikisi de bash komut dosyaları şunlarla test edildi:
for dom in dom.sub.example.{,{co,adm,com}.}{com,ac,de,uk};do
splitDom $dom myvar
printf "%-40s %-12s %s\n" $dom ${myvar[@]}
done
Posixsürüm ayrıntılı bir for
döngü ile test edildi , ancak
Tüm test komut dosyası aynı çıktıyı üretir:
dom.sub.example.com com dom.sub.example
dom.sub.example.ac ac dom.sub.example
dom.sub.example.de de dom.sub.example
dom.sub.example.uk uk dom.sub.example
dom.sub.example.co.com co.com dom.sub.example
dom.sub.example.co.ac ac dom.sub.example.co
dom.sub.example.co.de de dom.sub.example.co
dom.sub.example.co.uk co.uk dom.sub.example
dom.sub.example.adm.com com dom.sub.example.adm
dom.sub.example.adm.ac ac dom.sub.example.adm
dom.sub.example.adm.de de dom.sub.example.adm
dom.sub.example.adm.uk uk dom.sub.example.adm
dom.sub.example.com.com com dom.sub.example.com
dom.sub.example.com.ac com.ac dom.sub.example
dom.sub.example.com.de com.de dom.sub.example
dom.sub.example.com.uk uk dom.sub.example.com
Dosya okuma ve splitDom
döngü içeren tam betik , posix sürümüyle ~ 2m, $tlds
diziye dayalı ilk bash betiğiyle ~ 1m29s , ancak ilişkisel diziye~22s
dayalı son bash betiği ile .$TLDS
Posix version $tldS (array) $TLDS (associative array)
File read : 0.04164 0.55507 18.65262
Split loop : 114.34360 88.33438 3.38366
Total : 114.34360 88.88945 22.03628
Dolayısıyla, ilişkisel diziyi doldurmak zor bir işse, splitDom
işlev çok daha hızlı hale gelir!