1

所以我正在运行一组相当大的文件并通过批量重命名实用程序重命名它们。这个东西允许通过使用 PERL-5 的正则表达式重命名(或者至少它是这么说的)我有一堆当前格式为 [id] - [song name] - [artist] 的文件,需要交换歌曲名称和艺术家。

我用来从文件中获取信息的正则表达式是:

(.*) - (.*) - (.*)

然后重命名:

\1 - \3 - \2

问题是由于某种未知原因,它无法匹配或正确重组名称中包含撇号的某些文件,我不知道为什么。

例子:

CBE4-08-03 - My Lovin' (You're Never Gonna Get It) - En Vogue.zip <-匹配失败

CBE4-08-15 - 黑帮的天堂 - Coolio.zip <-正确匹配和更改

CBE5-22-11 - Little White Duck - Children's Favorites.zip <-匹配,更改为“- Children - Little White Duck.zip”

真正令人气愤的是,有很多次程序用“儿童”这个词重命名文件就好了,但似乎绊倒了其他人。

我知道这不是一个完全编程的问题,它可能只是我正在使用的程序搞砸了一些事情,我只是好奇是否真的有一个我只是想念的原因,如果有一些东西可以很好地了解以备将来使用。感谢您提供任何信息。

4

3 回答 3

2

这不是一个完整的答案,但您在“黑帮天堂”中有一个实际的撇号字符 ( ),但在其他两个文件名中U+0027有一个右单引号 ( )。U+2019

我假设您在 Windows 上,这意味着,我认为,文件名存储在 UTF-16 中。看来,批量重命名实用程序或它使用的PCRE 库不能正确处理 8 位范围之外的字符。

我不知道为什么它会失败(.*应该匹配任何字符序列,但是它们是被表示的),但是出了点问题。

于 2013-10-29T19:19:32.697 回答
1

perl 中的测试程序

use warnings;
use strict;

my @td = ( q|CBE4-08-03 - My Lovin’ (You’re Never Gonna Get It) - En Vogue.zip|,           q|CBE4-08-15 - Gangsta's Paradise - Coolio.zip|,
           q|CBE5-22-11 - Little White Duck - Children’s Favorites.zip|);

for my $r (@td) {
    $r =~s/(.*) - (.*) - (.*)/\1 - \3 - \2/;
    close($file);
}

这没有显示报告的行为。我的命令版本

rename 's/(.*) - (.*) - (.*)/\1 - \3 - \2/' *.zip

也工作得很好

希望这可以帮助

于 2013-10-29T18:55:38.277 回答
0

尝试一些不同的东西。

^(.*)-(.*)-(.*)$

^(.+)-(.+)-(.+)$

^([\S\s]*)-([\S\s]*)-([\S\s]*)$

^([\S\s]+)-([\S\s]+)-([\S\s]+)$

在所有情况下,不要只在那里有一个可用空间。

于 2013-10-29T18:56:27.803 回答