Regex Bash:从URL字符串中提取方案和主机部分
我需要从给定字符串中删除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="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?://[^/]+]]
匹配以(^
)literalhttp://
或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