我无法确定 mmv 模式。我有一堆具有这种模式的视频文件:
my.program.name.season.NN.episode.NN.-.title.avi
Run Code Online (Sandbox Code Playgroud)
我需要将它们移动到:
my.program.name.sNNeNN.title.avi
Run Code Online (Sandbox Code Playgroud)
我似乎无法得到正确的模式...
rename -n 's/^((\w+\.+){3})(.).*\.(.*)\.(.).*\.(.*)\.\-(\..*)$/$1$3$4$5$6$7/' *
Run Code Online (Sandbox Code Playgroud)
\w+匹配一个或多个单词字符,即[a-zA-Z0-9_]+[1]\.+匹配一个或多个点 ( .) 字符 [2]
注意的是\.在匹配.字符。我们需要使用\.来表示.as.在正则表达式中具有特殊含义。在\被称为转义代码,还原以下字符的原始字面意思。
(\w+\.+){3}从^文件名的开头(匹配名称的开头)开始匹配以上 [1],[2] 组字符的任何精度的最多 3 次。
这将匹配或返回my.program.name.
请注意,正则表达式周围的额外括号用于匹配分组。分组匹配开始(和结束,)用于提供所谓的反向引用。反向引用包含存储在特殊变量$1、$2、...、$9中的匹配子字符串,其中 $1 包含与第一对括号匹配的子字符串,依此类推。
.元字符点 (.) 匹配任何单个字符。例如...匹配任意 3 个字符。所以有了这个,(.)我们匹配了season它的第一个字符s。
.*\.匹配上面单个字符之后的所有内容,直到第一个.看到。正如您所看到的,我们没有将其捕获为一组匹配项,因为我们想从我们的名称中删除它,其中匹配eason..
(.*)匹配以上匹配后的所有内容。这匹配NN. 此处使用括号是因为我们希望将其保留在文件名中。
\.在上面的匹配之后匹配一个点。一.后先NN。
(.)再次使用这个我们匹配上面匹配之后的第一个单个字符。这只会返回e。
.*\.将匹配上述 match 之后的所有内容,直到 first .。会匹配pisode.。
(.*)匹配上面匹配中最后一个匹配点之后的任何内容。这将匹配 second NN。
\.\-匹配一个点.后跟一个破折号-。将匹配或返回.-
最后(\..*)$匹配一个点.和之后的所有内容,以文件名结尾。$匹配文件名或输入字符串的结尾。
注意:删除-n选项以执行实际重命名。