regex - BASH 正则表达式匹配 - 在要匹配的括号字符列表中包括括号?

标签 regex bash

我正在尝试编写一个小型 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-SOMEONE - [ 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

最佳答案

好吧,这是我第一次听说 =~ 运算符,但这是我通过反复试验发现的:

if [[ $newfile =~ ^(.*)([-[:space:][]*(what|ever)[][:space:]-]*)(.*)$ ]] 
                          ^^^^^^^^^^              ^^^^^^^^^^

看起来很奇怪但确实有效(刚刚测试过)。

编辑
引自 Linux 手册页 regex(7):

To include a literal ] in the list, make it the first character (following a possible ^). To include a literal -, make it the first or last character, or the second endpoint of a range. To use a literal aq-aq as the first endpoint of a range, enclose it in "[." and ".]" to make it a collating element (see below). With the exception of these and some combinations using aq[aq (see next paragraphs), all other special characters, including aq\aq, lose their special significance within a bracket expression.

关于regex - BASH 正则表达式匹配 - 在要匹配的括号字符列表中包括括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10181836/

相关文章:

javascript - 获取 URL 中的最后一个数字

css - css中的正则表达式是否符合W3C标准?

javascript - 需要帮助在 javascript 的 match 函数中使用正则表达式

bash - ts流制作中的ffmpeg两遍

bash - 使用 shell 工具提取文件的一部分

.net - 获取解析文本的正则表达式.net

android - 在android SDK中匹配两种格式的电话号码的最佳方法是什么?

bash:带有无符号整数的for循环

bash - 在 bash 循环脚本中,如何在同一行刷新输出? (取最后输出的位置)

c - 我如何编写一个函数,它接受可变数量的参数(整数)并使用标准参数输出它们?