因此,我正在运行一组相当大的文件,并通过大容量重命名实用程序重命名它们。这个东西允许通过使用PERL-5的正则表达式重命名(或者至少它是这么说的),我有一堆文件,这些文件目前都是id - song名称艺术家的格式,并且需要交换歌曲名和艺术家。
用于从文件中获取信息的正则表达式是:
(.*) - (.*) - (.*)然后用以下名称重命名:
\1 - \3 - \2问题是,由于一些未知的原因,它无法匹配或正确地重新组织一些文件,其中包括撇号的名字,我不知道为什么。
示例:
CBE4 4-08-03- My Lovin‘(你永远不会得到它)- En Vogue.zip <-失败匹配
CBE4 4-08-15-冈斯塔天堂- Coolio.zip <-匹配和适当改变
CBE5 5-22-11-小白鸭-儿童的Favorites.zip <-匹配,更改为"-儿童-小白鸭“
真正令人恼怒的是,有很多时候,程序的重命名文件用“儿童”这个词很好,但似乎被其他人绊倒了。
我知道这不是一个完全的编程问题,这可能只是我正在使用的程序在搞砸了一些事情,我只是好奇是否真的有什么原因让我错过了,如果有什么东西是很好的,知道将来的使用。谢谢你提供任何信息。
发布于 2013-10-29 19:19:32
这不是一个完整的答案,但是在"Gangsta's Paradise“中有一个实际的撇号字符(U+0027),但是在另外两个文件名中有一个正确的单引号(U+2019)。
我猜你在Windows上,我想这意味着文件名存储在UTF-16中。它使用的大容量重命名实用程序或PCRE文库似乎都不能正确地处理8位范围以外的字符。
我不知道它为什么会失败(.*应该匹配任何字符序列,不管它们是如何表示的),但是有些地方出了问题。
发布于 2013-10-29 18:55:38
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-29 18:56:27
尝试一些不同的东西。
^(.*)-(.*)-(.*)$
^(.+)-(.+)-(.+)$
^([\S\s]*)-([\S\s]*)-([\S\s]*)$
^([\S\s]+)-([\S\s]+)-([\S\s]+)$
在任何情况下,不要只是一个自由的空间。
https://stackoverflow.com/questions/19665196
复制相似问题