庆典;删除任何一组后缀

时间:2012-03-27 10:50:07

标签: bash pattern-matching

OSX Snow Leopard上的Bash脚本,我想删除任何一组文件后缀,而我的googlefu让我失望。

鉴于

file="filename_1"
file1=${file%_1}
echo $file1
filename

然而,将模式列表引入剥离的任何变化都使我失望,例如:

shopt -s extglob
file1=${file/@(%_1|%_end)/}
echo $file1
filename_1

我尝试将模式列表放在变量中,使用括号或无,引号或无。 我将得出结论,替换和修剪尾随字符串不会采用模式列表 - 或者我错过了一些相当明显的东西。感谢您提供有关优雅解决方案的建议或关于模式列表可能缺少的内容。

2 个答案:

答案 0 :(得分:4)

您的语法有点错误:${file%@(_1|_end)}

$ printf "%s\n" filename_1 filename_2 filename_end | 
  while read file; do echo ${file%@(_1|_end)}; done
filename
filename_2
filename

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

答案 1 :(得分:0)

如果使用两个命令是可以接受的,您可以使用sed执行类似的操作:

echo $YOURVARIABLE | sed 's/\(_1\|_WHAT\|_EVER\|_EXTENSION\)$//'