bash扩展通配符是否支持{n,m}区间表达式?能否删除末尾一对零?
Bash扩展通配符与末尾零删除方案
首先直接给你明确答案:bash的扩展通配符(extglob)不支持{n,m}这类指定重复次数的区间表达式。它的语法体系里只有五种模式:?(pattern-list)(0或1次匹配)、*(pattern-list)(0或多次)、+(pattern-list)(1或多次)、@(pattern-list)(匹配任一指定模式)、!(pattern-list)(匹配非指定模式),没有提供像ERE那样的{n,m}次数区间语法,你找不到相关文档说明是正常的。
接下来解决你的实际需求:删除字符串末尾仅一对零(也就是去掉最后两个0,末尾不足两个则保留原样),其实不用复杂的extglob就能轻松实现,用bash的参数扩展就足够了:
举几个例子验证:
# 测试案例1:末尾4个零 x="foobar0000" echo "${x%00}" # 输出: foobar00 # 测试案例2:末尾2个零 x="foobar00" echo "${x%00}" # 输出: foobar # 测试案例3:末尾3个零 x="foobar000" echo "${x%00}" # 输出: foobar0
这里的${x%00}是bash的最短后缀删除语法,会从字符串末尾开始匹配"00"并删除,如果末尾没有连续两个0,就不会做任何修改,完全符合你的需求。
如果你一定要用extglob来实现(虽然没必要),可以写成${x%@(00)},效果和上面完全一致——@(00)就是精确匹配"00"这个固定字符串,和直接写"00"没区别。
你之前尝试的${x%%+([0]{2})}无效,主要有两个原因:一是extglob不支持在+(...)内部嵌套{2}这种次数限定语法;二是%%是最长后缀删除,就算语法合法,它也会把末尾所有连续的偶数个0全部删掉,比如foobar0000会被改成foobar,不符合你要保留前面零的需求。
内容的提问来源于stack exchange,提问作者Inian
相关产品推荐
相关产品推荐

