如何使用 sed 删除 URL 中除域之外的所有内容?

如何使用 sed 删除 URL 中除域之外的所有内容?

我需要删除 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

使用URIPerl 模块从 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]/ipv6URL。

最好是使用适当的 URI 解析器,例如@Kusalananda 的方法尽管。

答案4

使用sed

$ sed -E 's/[^.]*\.([[:alpha:].]+).*/\1/' input_file
something.com
something.com

相关内容