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

Regex Bash:从URL字符串中提取方案和主机部分,regex,bash,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.or

我需要从给定字符串中删除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,这只是一个错误的方式


thx很多。

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

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

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

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

  • ^https?://[^/]+]]
    匹配以(
    ^
    )literal
    http://
    https://
    开头的任何字符串,并匹配后面不包括
    /
    [^/]+
    )的最长非空(
    +
    )字符运行

  • 内置数组
    BASH_REMATCH
    包含最新应用的
    =~
    运算符的结果,第一个元素(索引
    0
    )包含正则表达式作为一个整体匹配的任何内容。
    (后续元素将包含括号中的内容。) 子表达式(也称为捕获组)匹配,但在本例中,我们不使用任何子表达式)


    • 您可以使用
      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
      可能也是最容易获取url其余部分的方法:

      $ 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]}”
      拥有url的其余部分。

      BASH only?您可以使用awk或sed吗?非常适合我的需要,我只需将其更改一点点…^http://[^/]+…到…^https*://[^/]+…这样我就可以使用http和https了。@wfx:很高兴听到它;
      ^https://[^/]+
      更可靠一点,不过我已经更新了答案。
       $ [[ $_url =~ ^([^:]+://[^/]+)/?(.*)$ ]] && server="${BASH_REMATCH[1]}"
       $ echo "$server"
       http://download.enlightenment.org