Bash中提取含特殊字符变量内两模式间子串的问题
解决Bash中从含特殊字符的变量提取子串问题
问题背景
变量内容:
MQ_URI=ssl://b-7dda5da6-59a5-4150-8e2f-16534985665-1.mq.us-east-1.amazonaws.com:61617?jms.prefetchPolicy.queuePrefetch=0
需要提取ssl://和:61617?jms.prefetchPolicy.queuePrefetch=0之间的域名部分。
你之前命令的问题
sed命令错误原因:
你用了/作为sed替换命令的分隔符,但目标字符串里本身包含/(比如ssl://),sed会把第一个/当成分隔符,导致后续语法混乱。另外命令里的多余空格也会干扰匹配。grep命令错误原因:
正则表达式里的后向断言部分少了?(应该是:61617?jms...),而且命令末尾没闭合单引号,导致语法错误。
正确解决方法
方法1:修正sed命令(换分隔符)
把sed的分隔符换成和字符串里不冲突的符号(比如#),同时转义正则里的特殊字符?:
echo "$MQ_URI" | sed -E 's#.*ssl://(.*):61617\?jms.prefetchPolicy.queuePrefetch=0.*#\1#'
方法2:修正grep命令
补全引号,修正正则里的匹配内容,转义?:
echo "$MQ_URI" | grep -o -P '(?<=ssl://).*(?=:61617\?jms.prefetchPolicy.queuePrefetch=0)'
方法3:用Bash内置参数扩展(无需外部命令)
这种方法更高效,不用调用sed/grep:
# 先去掉ssl://前缀,再截取到第一个:之前的内容 echo "${MQ_URI#*ssl://}" | cut -d: -f1
或者用两次参数扩展一步到位:
temp="${MQ_URI#*ssl://}" echo "${temp%%:61617?*}"
内容的提问来源于stack exchange,提问作者Shahar Hamuzim Rajuan
相关产品推荐
相关产品推荐

