Переименование Perl: Гейтс, Билл -> Билл Гейтс - PullRequest
3 голосов
/ 12 ноября 2011

Предположим, у меня есть файлы с именами, например GATES, Bill.jpg, и я хочу переименовать их все в Bill Gates.jpg.Я могу захватить два слова

rename 's/^(.*?), (.*?)\./$2 $1\./g' *

Чтобы изменить регистр, есть некоторые функции Perl:

$lower = lc("aBcDe");  # $lower is assigned "abcde" 
$upper = uc("aBcDe");  # $upper is assigned "ABCDE"
$lower = lcfirst("HELLO");  # $lower is assigned "hELLO" 
$upper = ucfirst("hello");  # $upper is assigned "Hello"

Я пытался использовать их:

rename 's/^(.*?), (.*?)\./$2 ucfirst($1)\./g' *

Но это не работает.

Ответы [ 2 ]

9 голосов
/ 12 ноября 2011

Вам необходимо добавить флаг «e» (eval) в конец регулярного выражения, иначе функция не будет выполнена.Это означает, что вся вторая часть выражения s/// должна быть допустимым выражением Perl (вместо допустимой строки):

rename 's/^(.*?), (.*?)\./"$2 " . ucfirst(lc($1)) . "."/ge' *

(также обратите внимание на дополнительный пробел внутри строки с помощью $2)

Более подробную информацию об этом флаге можно найти в документации perlre.

4 голосов
/ 12 ноября 2011

Должно быть:

rename 's/^(.*?), (.*?)\./$2 \u\L$1./g' *

Хотя это не всегда отлично работает на Unicode.Для тех немногих угловых случаев, которые он пропускает, вам нужно что-то более похожее на

rename 's/^(\w)(\w*),\s+(\w+)\./$3 \u$1\L$2./g' *

. Здесь вы можете получить несколько обновленную версию обычной rename программы .

...