我正在尝试做一个小的 bash 脚本,它会清理我喜欢的一些电视节目的下载剧集的文件和文件夹名称。它们通常看起来像“[www.Speed.Cd] - Some.Show.S07E14.720p.HDTV.X264-SOMEONE”,我基本上只是想去掉那个 speedcd 广告位。
在 BASH 中使用正则表达式匹配来删除 www.Speed.Cd、空格和破折号很容易,但对于我来说,我无法弄清楚如何在要匹配的字符列表中包含括号。[- [] 不起作用,[- \[]、[- \\[]、[- \\\[] 或我要删除的括号前面的任何数量的转义字符也不起作用。
这是我到目前为止所得到的:
[[ "$newfile" =~ ^(.*)([- \[]*(www\.torrenting\.com|spastikustv|www\.speed\.cd|moviesp2p\.com)[- \]]*)(.*)$ ]] &&
newfile="${BASH_REMATCH[1]}${BASH_REMATCH[4]}"
但它打破了括号。
有任何想法吗?
TIA,丹尼尔:)
编辑:我可能应该注意到我正在使用“shopt -s nocasematch”来确保不区分大小写的匹配,以防万一你想知道:)
编辑2:感谢所有做出贡献的人。我不能 100% 确定哪个答案是“正确的”,因为我的陈述有几个问题。实际上,最准确的答案只是对jw013发布的我的问题的评论,但我当时没有得到它,因为我还不明白空格应该被转义。我选择了 aefxx,因为那个人基本上说的是一样的,但有解释:) 也希望在 ormaaj 的答案上加上一个正确的答案标记,因为他发现我的表达有更严重的问题。
无论如何,我在上面使用的方法,试图匹配和提取部分以保留和留下不需要的部分真的不是很优雅,并且不会捕捉所有情况,甚至不是像“Some.Show.S07E14”这样非常简单的东西.720p.HDTV.X264-某人 - [ www.Speed.Cd ]”。相反,我重写了它以匹配并仅提取不需要的部分,然后对原始字符串上的部分进行字符串替换,就像这样(循环是在有多个品牌的情况下):
# Remove common torrent site brandings, including surrounding spaces, brackets, etc.:
while [[ "$newfile" =~ ([[\ {\(-]*(www\.)?(torrentday\.com|torrenting\.com|spastikustv|speed\.cd|moviesp2p\.com|publichd\.org|publichd|scenetime\.com|kingdom-release)[]\ }\)-]*) ]]; do
newfile=${newfile//"${BASH_REMATCH[1]}"/}
done