Bash:从URL字符串中提取方案和主机部分

时间:2016-11-06 20:44:46

标签: regex bash

我需要从给定的字符串中删除url。 我唯一的解决方案是:

_url="http://download.enlightenment.org/rel/apps/econnman/econnman-1.1.tar.gz"
_l=${_url%.*/*}        #  http://download.enlightenment
_l=${#_l}              #  29
_url=${_url:0:${l}+4}  #  http://download.enlightenment.org

但是这对于每个没有3个字符长度的TLD都会失败,而且它的方式是错误的。

很多。

3 个答案:

答案 0 :(得分:3)

您可以使用grep

 $ echo "$_url" | grep -Eo '^http[s]?://[^/]+'
 http://download.enlightenment.org

您可以将expr与正则表达式一起使用:

$ echo `expr "$_url" : '\(http://[^/]*\)'`
http://download.enlightenment.org

或者,使用awk

echo "$_url" | awk -F/ 'BEGIN{OFS=FS} {print $1 OFS OFS $3}'
http://download.enlightenment.org

您可以使用cut

echo "$_url" | cut -d/ -f1-3
http://download.enlightenment.org

cut可能最容易获得其余的网址:

$ echo "$_url" | cut -d/ -f4-
rel/apps/econnman/econnman-1.1.tar.gz

或者,完全是Bash内部的:

 $ [[ $_url =~ ^([^:]+://[^/]+)/?(.*)$ ]] && server="${BASH_REMATCH[1]}"
 $ echo "$server"
 http://download.enlightenment.org

"${BASH_REMATCH[2]}"包含其余网址。

答案 1 :(得分:2)

shell变量中已包含的值中提取子字符串,请使用Bash的正则表达式匹配运算符=~ ,它支持扩展的正则表达式:

注意:dawg's answer包含更适合通过多个输入从文件 stdin 输入的解决方案。
由于涉及子进程,它们会产生启动成本,但是对于非常值得的输入集合,因为外部实用程序在处理更大的输入集时效率更高。 功能

_url='http://download.enlightenment.org/rel/apps/econnman/econnman-1.1.tar.gz'
[[ $_url =~ ^https?://[^/]+ ]] && _url="${BASH_REMATCH[0]}"
echo "$_url"   # -> 'http://download.enlightenment.org'
  • ^https?://[^/]+ ]]匹配任何以(^)文字http://https://开头的字符串,并匹配最长的非空(+)后面的字符不包括/[^/]+)。

  • 内置数组BASH_REMATCH包含=~运算符的最新应用程序的结果,第一个元素(索引为0)包含正则表达式匹配的任何内容作为一个整体 (后续元素将包含括号内容 sub - 表达式(a.k.a捕获组)匹配,但在这种情况下我们没有使用任何)。

答案 2 :(得分:0)

我不知道这是否适用于bash,但它适用于pcre正则表达式引擎。

(?<=:\/\/)(.*)(?=\/)

查找第一个/和第二个/之间的所有文字。适用于https://google.com/但不适用于google.com/https://google.com。取决于你需要什么。

Regex 101