从URL中提取哈希地址



我有一个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|'

最新更新