Bash/ksh前缀子串移除结果不符预期,请求技术排查
Shell前缀匹配移除未生效的原因
测试场景回顾
string="abcABC123ABCabc" # 符合预期的前缀匹配结果 echo ${string#a*C} # 输出:123ABCabc(移除开头最短的a*C) echo ${string##a*C} # 输出:abc(移除开头最长的a*C) # 未符合预期的结果 echo ${string#B*c} # 输出:abcABC123ABCabc(无变化) echo ${string##B*c} # 输出:abcABC123ABCabc(无变化)
问题核心
${string#substring} 和 ${string##substring} 是前缀匹配移除,规则是:必须从字符串的第一个字符开始匹配给定的模式,匹配成功才会移除对应部分;如果模式无法匹配字符串的开头,直接返回原字符串。
你的字符串开头是a,而模式B*c是以B开头的,完全无法匹配前缀,所以Shell不会做任何移除操作,直接返回原字符串。
实现预期结果的正确写法
如果你想实现以下预期:
- 第三个命令返回
abcABC123A(移除从第一个B到末尾的最短匹配后缀) - 第四个命令返回
abcA(移除从第一个B到末尾的最长匹配后缀)
需要用后缀匹配的%(最短后缀移除)和%%(最长后缀移除):
# 移除最短匹配的后缀(从末尾往前找第一个符合B*c的模式) echo ${string%B*c} # 输出:abcABC123A # 移除最长匹配的后缀(从末尾往前找最靠前的符合B*c的模式) echo ${string%%B*c} # 输出:abcA
内容的提问来源于stack exchange,提问作者Renato
相关产品推荐
相关产品推荐

