我将提要标题中除字母和数字之外的所有字符替换为破折号,以将结果用作任何文件系统的安全文件名:
$ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar"
$ echo ${t//[^A-Za-z0-9]/-}
Episodie-06--No-hope-of-riding-home--NEW----Advanced-grammar
不过,我想将所有重复的破折号压缩为一个破折号,例如Episodie-06-No-hope-of-riding-home-NEW-Advanced-grammar
我发现我可以使用两遍替换来实现它:
$ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar"
$ tmp=${t//[^A-Za-z0-9]/-}
$ echo ${tmp//--/-}
Episodie-06-No-hope-of-riding-home-NEW--Advanced-grammar
我想我可以一次性完成它,例如:
$ echo ${t//[^A-Za-z0-9]+/-}
但它不起作用。
有什么线索吗?
注意:我不想使用sed
或其他工具
答案1
您需要比传统 shell 通配符更强大的东西。在 bash 中,设置该extglob
选项,该选项使您可以访问以下中的正则表达式全局模式通过从 ksh 继承的不寻常语法。
shopt -s extglob
sanitized=${raw//+([^A-Za-z0-9])/-}
答案2
tr
是这项工作的好工具
new=$( printf "%s" "$t" | tr -cs 'a-zA-Z0-9' '-' )
new=${new#-}; new=${new%-}