Mac*_*exa 1 regex subdomain bash awk grep
这个正则表达式包含一切。我怎样才能只搜索域而不是额外的字符。
echo "AAAA cccc.google.com BBBB" | grep -oE "[^\.\n]*((\.[^\.\n]*){2}$)" --color=always
Run Code Online (Sandbox Code Playgroud)
我想cccc.google.com被抓,但不是AAAA cccc.google.com BBBB。添加 \b 不起作用。
echo "AAAA cccc.google.com BBBB" | grep -oE "\b[^\.\n]*((\.[^\.\n]*){2}\b$)\b" --color=always
编辑:我忘了说,我需要 grepping 第三级和第四级域。这就是我的意思:
g.google.com 这是一个三级域名a.b.google.com 这是一个 4 级域。我上面的正则表达式是 grepping 三级域,但它 grep 了一些其他字符,所以我问了问题。假设我有AAAA a.b.c.d.e.g.google.com BBBB那么 {3} 应该给我 g.google.com 和 {4} 或 {3,4} 应该给我 eggoogle.com 同时省略一些不需要的字符。我的正则表达式正是这样做的,但有额外的字符!
因此,使用此正则表达式(来自答案,已修改):
echo "AAAA d.cccc.google.com BBB" | grep -oE '\w+(\.\w+){2}'
省略了我的正则表达式没有的 .com 部分(但它会打印 exta char :( )。所以,请修改以在这种情况下工作。
看起来 OP 想要一个交互式正则表达式(在评论中澄清),它可以提取 n 个域,其中 n 是可变的。
这样的事情应该工作 - (?:\w+(?:\.|\b)){4}(?=\.\w+(?: |$))\.\w+
查看演示
{2}$ echo "AAAA a.b.c.d.e.g.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){2}(?=\.\w+(?: |$))\.\w+"
g.google.com
Run Code Online (Sandbox Code Playgroud)
捕获 2 个子域,不包括顶级域(即com){3}$ echo "AAAA a.b.c.d.e.g.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){3}(?=\.\w+(?: |$))\.\w+"
e.g.google.com
Run Code Online (Sandbox Code Playgroud)
捕获 3 个子域,不包括顶级域(即com)...等等
(?:\w+(?:\.|\b)){3}<- 这与我的原始答案相同,它只捕获单词字符后跟 a .,正好 3 次
(?=\.\w+(?: |$))\.\w+<- 这作为前一个正则表达式的停止点。它标志着顶级域的开始并捕获它。
该正则表达式似乎完全错误,如果您只想匹配 url 之类的cccc.google.com和www.google.com但不是google.com,则应使用-(?:\w+(?:\.|\b)){3}
查看演示
主要部分是\w+(?:\.|\b)- 这匹配紧随其后的单词字符.或单词边界(即空格)
这是用 a 括起来的,以(?:){3}确保遇到此类组 3 次。
要也 grep 4 级域,只需将更{3}改为{3,4}
(?:\w+(?:\.|\b)){3,4}
查看演示
这是你应该如何做grep-
$ echo "AAAA cccc.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){3,4}"
cccc.google.com
Run Code Online (Sandbox Code Playgroud)
与 d.cccc.google.com
$ echo "AAAA d.cccc.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){3,4}"
d.cccc.google.com
Run Code Online (Sandbox Code Playgroud)