我有一个url保存在一个包含散列地址的变量中:
url1="https://some.com/ofthis/addr1vxu5xx7nyrqh9gku9530c9mme"
url2="https://some.com/ofthis/addr1vxu5xx7nyrqh9gku9530c9mme/8638ffe0/moreof/that"
我想提取这个url的地址部分,这意味着它总是以"addr1"和以以下"/">结束(地址后面可能没有斜杠,比如$url1,或者后面可能有未知数量的斜杠,比如$url2。第一种模式"addr1"必须包含,而以下第一个"/"必须排除
我只需要这部分:
addr1vxu5xx7nyrqh9gku9530c9mme
我试着用sed这样做,并且几乎到达那里,但是在第一个模式"addr1"下面是:
echo "$url2" | sed -e 's/.*(addr1)(.*)/.*/ 1 2/'
如果我使用$url1,我得到:
https://some.com/ofthis/addr1vxu5xx7nyrqh9gku9530c9zaf4tydnelcg0erqd03wa6laqkctmme
不以"addr1"开头。
我使用这个$url2,我得到:
addr1 vxu5xx7nyrqh9gku9530c9zaf4tydnelcg0erqd03wa6laqkctmme/8638ffe0/moreof
首先,在"addr1"弦的其余部分。第二,它从最后一个"/">
编辑:URL也可以有典型的特殊字符,如&还是?地址后面。我猜正则表达式需要代表/OR的东西?或者,。也许有一个特殊角色的职业?
如有任何帮助,不胜感激。
谢谢!
$ echo "$url1" | cut -d'/' -f5
addr1vxu5xx7nyrqh9gku9530c9mme
$ echo "$url2" | cut -d'/' -f5
addr1vxu5xx7nyrqh9gku9530c9mme
与bash
和一个正则表达式:
[[ $url2 =~ addr[^/]* ]] && echo "${BASH_REMATCH[0]}"
输出:
<>以前addr1vxu5xx7nyrqh9gku9530c9mme使用参数替换循环使用OP的4x场景:
for url in 'http://some/stuff/addr1XYZabcdef123' 'http://some/stuff/addr1XYZabcdef123?def=xyz' 'http://some/stuff/addr1XYZabcdef123&some other stuff' 'http://some/stuff/addr1XYZabcdef123/ignore/this/stuff'
do
addr="addr1${url//*addr1/}" # strip everything up to and including "addr1"; append new "addr1" on the front
addr="${addr//[/?&]*/}" # strip everything from any of the 3x chars '/' '?' '&' to end of line
echo "${addr}"
done
由此产生:
addr1XYZabcdef123
addr1XYZabcdef123
addr1XYZabcdef123
addr1XYZabcdef123
无需添加空格:
echo "$url2" | sed -ne 's/.*(addr1[^/]*).*/1/p'
结果:addr1vxu5xx7nyrqh9gku9530c9mme
正则表达式解释
--------------------------------------------------------------------------------
.* any character (0 or more times)
--------------------------------------------------------------------------------
( group and capture to 1:
--------------------------------------------------------------------------------
addr1 'addr1'
--------------------------------------------------------------------------------
[^/]* any character except: '/' (0 or more times)
--------------------------------------------------------------------------------
) end of 1
--------------------------------------------------------------------------------
.* any character (0 or more times)
可能是这个
echo "$url" | sed -E 's|https:.*(addr1[^/]*).*|1|'