gpt4 book ai didi

bash - bash 中域名的最长公共(public)后缀

转载 作者:行者123 更新时间:2023-11-29 09:19:55 24 4
gpt4 key购买 nike

原始问题:我有一个域的子域列表,例如,a.domain.frb.domain.fr ,等等。域本身可以在列表中。

我想从这个域列表中找到 domain.fr,它正在寻找不以点 . 开头的最长公共(public)后缀。

域列表是一个 bash 字符串,域之间用一个空格分隔。

我读了Longest common prefix of two strings in bash但我没有设法将其转换为后缀:

echo $domains | tr ' ' '\n' | sed -e 'N;s/^.*\(.*\)\n.*\1$/\1/'

...打印一堆空行,并且:

echo $domains | tr ' ' '\n' | sed -e 'N;s/^.*\.\(.*\)\n.*\.\1$/\1/'

...打印一堆 fr


我不寻求极端的可移植性,无需额外安装即可在任何 Linux 发行版上运行的东西对我来说没问题。

我正在寻找一种可以找到子域作为公共(public)“域”的解决方案,例如,对于以下列表:

a.d.domain.fr b.d.domain.fr c.d.domain.fr

...公共(public)域应该是 d.domain.fr,但是如果您有一个仅适用于顶级域的有效解决方案(例如,它将返回 domain.fr 对于上面的列表),我也很感兴趣。


示例字符串(每行一个示例):

a.domain.fr domain.fr b.a.domain.fr b.domain.fr u.domain.fr
domain.fr
a.domain.fr
a.domain.fr b.domain.fr domain.fr
a.d.domain.fr b.d.domain.fr c.d.domain.fr

最佳答案

您可以使用 awk 将域的每个部分一一比较并跟踪共同部分的数量:

# on the first line
NR == 1 {
# split first domain into "parts" for comparison with rest
n = split($1, parts, /\./)
# initialise result
c = n
}

# on every line
{
for (i = 1; i <= NF; ++i) {
# split current record into "s"
m = split($i, s, /\./)

# increment j as long as the last elements of "parts" match "s"
for (j = 0; j < c && parts[n-j] == s[m-j]; ++j);

# update count if lower
if (j < c) c = j
}
}

# print the result, joining the parts with a "." and ending with a newline
END { for (i = 1; i <= c; ++i) printf "%s%s", parts[n-c+i], (i < c ? "." : ORS) }

保存脚本并像 awk -f script.awk file 一样运行它。

关于bash - bash 中域名的最长公共(public)后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55570761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com