2012-05-02 3 views
0

Я пытаюсь переименовать кучу файлов в моем каталоге, и я застрял в его регулярной части.Удалить символы и цифры из строки в perl

Я хочу удалить определенные символы из имени файла, которые появляются в начале.

Example1: _00-author--book_revision_

Ожидаемый: Author - Book (Revision)

До сих пор, я могу использовать регулярное выражение для удаления подчеркивания & captialize первой буквы

$newfile =~ s/_/ /g; 
$newfile =~ s/^[0-9]//g; 
$newfile =~ s/^[0-9]//g; 
$newfile =~ s/^-//g; 
$newfile = ucfirst($newfile); 

Это не хороший метод. Мне нужна помощь в удалении всех символов, пока вы не нажмете первую букву, и когда вы нажмете первый «-», я хочу добавить пробел до и после «-». Кроме того, когда я ударил второй «-» Я хочу, чтобы заменить его «(»

Любого руководства, советы или даже предложения о том, что нашел правильный подход очень ценятся

ответ

1

Так что вам хотите использовать все компоненты нового имени файла или просто первый? Ваш вопрос непоследователен в этом вопросе.

Обратите внимание, что если вы на Linux, вы, вероятно, имеют rename команду, которая будет принимать выражение PERL и использовать его для переименования файлов для вас, что-то вроде этого:

rename 'my ($a,$b,$r);$_ = "$a - $b ($r)" 
    if ($a, $b, $r) = map { ucfirst $_ } /^_\d+-(.*?)--(.*?)_(.*?)_$/' _* 
1

Ваших инструкции и ваш пример дон.. «т матч.

в соответствии с вашими указаниями,

s/^[^\pL]+//; # Remove everything until first letter. 
s/-/ - /;  # Replace first "-" with " - " 
s/-[^-]*\K-/(/; # Replace second "-" with "(" 

Согласно вашему примеру,

s/^[^\pL]+//; 
s/--/ - /; 
s/_/ (/; 
s/_/)/; 
s/(?<!\pL)(\pL)/\U$1/g; 
+0

Спасибо большое !! s/-/- /; <- Wont это заменяет каждый '-' на '-' ?? Кроме того, как я могу добавить ')' в конце имени файла? – Naveen

+0

Я только что осознал свою ошибку. У меня есть несколько файлов, названных так, как показано в приведенном выше примере, и некоторые файлы, называемые версией 00-author-book-revision. В любом случае, я хочу, чтобы файлы были переименованы в Author-Book (ревизия). Но ваш вклад определенно помог мне здесь, и я собираюсь выяснить, как исправить эту проблему. – Naveen

+0

@Naveen, Без/g он просто заменит первый. '$ s. = ')';' – ikegami

0

Если все они следуют за этот формат, то попробуйте:

my ($author, $book, $revision) = $newfiles =~ /-(.*?)--(.*?)_(.*?)_/; 

print ucfirst($author) . " - $book ($revision)\n"; 
1
$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u\1 - \u\2 (\u\3),; 

Мой Perl интерпретатор (используя строгие и предупреждения) говорит, что это лучше написано как:

$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u$1 - \u$2 (\u$3),; 

Первая из них, вероятно больше sedish по его вкусу! (Конечно, обе версии работает точно так же.)

Объяснение (по просьбе stema):

$filename =~ s/ 
^  # matches the start of the line 
    _\d+- # matches an underscore, one or more digits and a hypen minus 
    (.*?)-- # matches (non-greedyly) anything before two consecutive hypen-minus 
      # and captures the entire match (as the first capture group) 
    (.*?)_ # matches (non-greedyly) anything before a single underscore and 
      # captures the entire match (as the second capture group) 
    (.*?)_ # does the same as the one before (but captures the match as the 
      # third capture group obviously) 
    $  # matches the end of the line 
/\u$1 - \u$2 (\u$3)/x; 

\u${1..3} в спецификации замены просто говорит Perl, чтобы вставить группы захвата от 1 до 3 с их первым знак производства верхний. Если бы вы хотели сделать весь матч (в захваченной группе) в верхнем регистре, вам пришлось бы использовать \U.

The х флагов включается подробный режим, который говорит интерпретатор Perl, который мы хотим использовать # комментарии, так что он будет игнорировать эти (и любой пробел в регулярном выражении - так что если вы хотите в поле вы должны использовать либо \s, либо \). К сожалению, я не мог понять, как сказать Perl игнорировать пробел в спецификации * replacement *, поэтому я написал это в одной строке.

(Также обратите внимание, что я изменил свое s терминатор с , к /. - Perl рявкнул на меня, если я использовал , с многословным режим включен ... точно не знаю, почему)

+0

+1 для обучения мне '\ u', но чтобы сделать его настоящим хорошим ответом, пожалуйста, немного объясните, что здесь происходит. – stema