我需要从给定的字符串中删除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都会失败,而且它的方式是错误的。
很多。答案 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
。取决于你需要什么。