我需要删除 URL 中的所有内容并仅保留域。
在 sed 示例之前:
https://www.something.com/something/something
https://www.something.com:8080/something/something
sed 之后:
某某网站
答案1
像这样的东西吗?
$ url1='https://www.something.com:8080/something/something'
$ url2='http://www.someting.com/something/something'
$ printf "%s\n%s\n" "$url1" "$url2" | \
> sed -e 's|^.*://||' \
> -e 's|/.*$||' \
> -e 's|:.*$||' \
> -e 's|^.*@||' \
www.something.com
www.someting.com
这将四个sed
表达式链接在一起:
s|^.*://||
:删除从开始到包括在内的所有内容://
s|/.*$||
:删除从第一个斜杠到末尾剩余的所有内容s|:.*$||
:删除从第一个冒号到末尾剩余的所有内容s|^.*@||
: 删除所有内容,包括@
ex:ftp://user:[email protected]
你只剩下www.something.com
. www
实际上是域的一部分。 (unix.stackexchange.com
与 具有不同的 IP math.stackexchange.com
)
答案2
使用URI
Perl 模块从 URL 中提取主机名,然后替换以www.
从该主机名的开头删除:
perl -MURI -ple '$_ = URI->new($_)->host(); s/^www\.//'
测试:
$ cat file
https://www.something.com/something/something
https://www.something.com:8080/something/something
https://something.com:999/something/something
$ perl -MURI -ple '$_ = URI->new($_)->host(); s/^www\.//' <file
something.com
something.com
something.com
答案3
通过grep
支持perl
类似正则表达式的实现-P
以及-o
诸如 GNU 之类的选项grep
:
grep -iPo '://([^/@]*@)?(www\.)?\K(\[.*?\]|[^:/]+)'
([^/@]*@)?
尝试跳过该user:pass@
部分(如果有)\[.*?\]
以处理https://[abcd::cdef]/ipv6
URL。
最好是使用适当的 URI 解析器,例如@Kusalananda 的方法尽管。
答案4
使用sed
$ sed -E 's/[^.]*\.([[:alpha:].]+).*/\1/' input_file
something.com
something.com