如何在Bash中删除字符串末尾的连续指定分号?
解决方案
你原本的sed命令仅匹配单个行尾分号,给匹配规则添加连续量词即可一次删除所有末尾分号,以下是几种常用实现方案:
方法1:sed单步实现(无需重复执行)
扩展正则写法
sed -E 's/;+$//'
-E开启扩展正则支持;+匹配1个及以上连续的分号$锚定匹配到行尾
兼容基础正则写法
sed 's/;*$//'
;* 匹配0个及以上连续分号,就算行尾没有分号也不会修改原内容,兼容性更强。
测试示例:
i="Item1;Item2;Item3;;;;;;;;" echo "$i" | sed 's/;*$//' # 输出:Item1;Item2;Item3
方法2:Bash原生参数扩展(最高效,无外部进程调用)
如果是处理Bash变量,用内置操作性能最优,不需要创建子进程调用外部工具:
- 开启extglob扩展匹配(多数发行版默认已开启,未开启可手动执行):
shopt -s extglob - 直接删除变量末尾所有连续分号:
i=${i%%+(;)}
测试示例:
shopt -s extglob i="Item1;Item2;Item3;;;;;;;;" i=${i%%+(;)} echo "$i" # 输出:Item1;Item2;Item3
方法3:awk实现
awk '{sub(/;*$/, "")}1'
测试示例:
i="Item1;Item2;Item3;;;;;;;;" echo "$i" | awk '{sub(/;*$/, "")}1'
内容的提问来源于stack exchange,提问作者NewKidOnTheBlock
相关产品推荐
相关产品推荐

