我有一个大文件,其中包含以下形式的域名:
domain.com
sub.domain.com
sub.domain.co.uk
domain.co.uk我想提取主域名(没有子域名)与顶级域名(如.com)或国家代码顶级域名。
顶级域名总是在2-3个字母之间(例如.com、.net、.gov)。
国家代码的顶级域名总是两个字母(如.uk,.us),并出现在行的末尾。
因此,如果输入中包含上述列表,则输出应该提取:
domain.com
domain.co.uk我试过这样的表达:
grep -P '^[^\.]+\.[a-zA-Z]{2,3}\.[a-zA-Z]{2}$这是我的解释。-P:perl regex ^:行的开头[^\.]:排除点+:一次或多次\.:点[a-zA-Z]{2,3}:两个或三个字母字符(例如,.com,.co) [a-zA-Z]{2}$:行尾的两个字母字符
我的问题:我得到的输出总是被摘录出来:
domain.co.uk但不是domain.com
如何使regex提取带有或不带国家代码的域名,例如domain.com和domain.co.uk,但没有sub.domain.co.uk或sub.domain.com等子域
发布于 2023-05-09 21:56:04
尝试通过使用?使最后一个国家代码TLD成为可选的,下面是一些这样做的例子。
使用扩展正则表达式
grep -E '^[^.]+\.[a-zA-Z]{2,3}(\.[a-zA-Z]{2})?或perl regexgrep -P '^[^.]+\.[a-zA-Z]{2,3}(?:\.[a-zA-Z]{2})?或perl regexA2或perl regex
A2
发布于 2023-05-10 06:02:04
如果您认为顶级后缀可以是.us、.gov.uk、.tas.gov.au、.uk,那么唯一有效的方法就是硬编码完整的列表。
您可以使用Domain::PublicSuffix perl模块:
$ perl -MDomain::PublicSuffix -lne '
BEGIN{$s = Domain::PublicSuffix->new}
print if $_ eq $s->get_root_domain($_)' < your-file
domain.com
domain.co.uk这里使用模块附带的默认列表,但如果需要,也可以按照其文档提供一份最新的清单。
在Debian上,可以在libdomain-publicsuffix-perl包中找到该模块。
发布于 2023-05-09 22:17:56
grep -E "^[[:alnum:]-]+(([.][[:alpha:]]{2}){2}|[.][[:alpha:]]{3})$"启动时锚定的^[[:alnum:]-]+一个或多个域有效字符
(启动总体小组,第一届任期如下
以点开始的([.][[:alpha:]]{2})子组,后面是两个alpha字符
{2}以前的子组精确重复两次
|在over中分隔下一个项
以点开始的[.][[:alpha:]]{3}群项,后面跟着三个α字符
)$关闭组,锚到字符串的末端
https://unix.stackexchange.com/questions/745427
复制相似问题