所以我正在运行一大堆文件,并通过Bulk Rename Utility重命名它们。这个东西允许通过使用PERL-5的正则表达式重命名(或者至少就是它所说的)我有一堆目前格式为[id] - [歌曲名称] - [艺术家]并且需要交换的文件歌曲名称和艺术家。
我用来从文件中获取信息的正则表达式是:
(.*) - (.*) - (.*)
然后用:
重命名\1 - \3 - \2
问题是由于某些未知原因,它无法匹配或正确重新组织其名称中包含撇号的某些文件,我无法弄清楚原因。
示例:
CBE4-08-03 - 我的Lovin'(你永远不会得到它) - En Vogue.zip< - 无法匹配
CBE4-08-15 - Gangsta的天堂 - Coolio.zip< - 正确匹配和更改
CBE5-22-11 - 小白鸭 - 儿童的最爱.zip< - 匹配,更改为“ - 儿童 - 小白鸭.zip”
关于这一点的真正令人愤怒的部分是,有很多时候程序用“儿童”这个词重命名文件就好了,但似乎又绊倒了别人。
我知道这不是一个完全编程的问题,它可能只是我正在使用的程序弄乱了一些东西,我只是好奇是否真的有这个原因让我失踪了,如果有的话,将来会很有用。感谢您的任何信息。
答案 0 :(得分:2)
这不是一个完整的答案,但你在“Gangsta's Paradise”中有一个实际的撇号字符(U+0027
),而在另外两个文件名中有一个正确的单引号(U+2019
)。
我认为你在Windows上,我认为,这意味着文件名存储在UTF-16中。看来它使用的Bulk Rename Utility或PCRE library无法正常使用8位范围之外的字符。
我不知道它为什么会失败(.*
应匹配任何字符序列,但它们已被表示),但某些出错了。
答案 1 :(得分: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
也工作正常
希望这有帮助
答案 2 :(得分:0)
尝试一些不同的东西。
^(.*)-(.*)-(.*)$
^(.+)-(.+)-(.+)$
^([\S\s]*)-([\S\s]*)-([\S\s]*)$
^([\S\s]+)-([\S\s]+)-([\S\s]+)$
在所有情况下,不要只有一个自由空间。