如何从URL中提取以addr1开头、截止到特殊字符的哈希地址
实现需求的sed规则
最终可用命令
echo "$url" | sed -n 's/.*\(addr1[^/?&]*\).*/\1/p'
规则说明
-n:关闭sed默认输出,只打印匹配替换成功的行- 匹配逻辑:
- 开头的
.*匹配addr1之前的所有URL前缀内容 - 捕获组
\( \)内的部分就是目标地址:- 固定匹配开头
addr1 [^/?&]*匹配所有不属于/、?、&的字符,遇到第一个截断特殊字符就停止匹配,没有特殊字符则直接匹配到URL结尾
- 固定匹配开头
- 结尾的
.*匹配地址之后的所有多余内容
- 开头的
- 替换逻辑:将整行内容替换为捕获组提取到的地址,
p参数控制替换成功后输出结果
测试效果
- 测试
url1="https://some.com/ofthis/addr1vxu5xx7nyrqh9gku9530c9mme",输出:addr1vxu5xx7nyrqh9gku9530c9mme - 测试
url2="https://some.com/ofthis/addr1vxu5xx7nyrqh9gku9530c9mme/8638ffe0/moreof/that",输出:addr1vxu5xx7nyrqh9gku9530c9mme - 测试带参数场景
url3="https://some.com/addr1vxu5xx7nyrqh9gku9530c9mme?param=123&other=456",输出:addr1vxu5xx7nyrqh9gku9530c9mme
原有命令问题说明
- 用了
\(.*\)\/的贪婪匹配逻辑,会匹配到URL最后一个/,导致保留了多余的路径内容 - 替换表达式里加了多余空格,导致输出结果有多余空格
- 没有兼容
addr1后面直接到URL结尾的场景,导致url1处理失败 - 没有覆盖
?、&等特殊截断字符的判断
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

