You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:48:31