Mac OS X Переименование файлов в пакетном режиме (2 шаблона) - PullRequest
0 голосов
/ 09 мая 2018

Я бы хотел сопоставить шаблон \d\dQ\d или \dQ\d\d и переформатировать его перед именем файла. Используя OSX Terminal или ruby, что будет лучшим способом сделать это? Это немного сложнее, потому что это шаблон 1 или шаблон 2.

В первом файле, например, шаблон «3Q17» - это дата, которая означает 3-й квартал 2017 года. Мне нужно добавить 2017Q3 перед именем файла. Тем не менее, у меня есть другая модель "05Q1", которая означает 1-й квартал 2005 года, поэтому мне нужно добавить 2005Q1.

Файлы:

ABC-EDFGH-JLG-Sample-3Q17-fIS.pdf 
                     ^^^^
2Q13 ABC MF PM Example_fIS.pdf
^^^^
03Q1_FIS.pdf 
^^^^
05Q1 ABC_IS.pdf
^^^^

Файлы переименованы:

2017Q3_ABC-EDFGH-JLG-Sample-3Q17-fIS.pdf
2013Q2_2Q13 ABC MF PM Example_fIS.pdf
2003Q1_03Q1_FIS.pdf
2005Q1_05Q1 ABC_IS.pdf

Этот вопрос помогает с одним шаблоном, но не с двумя.

Mac OS X терминальное пакетное переименование

Мой код ruby ​​работает нормально:

Dir.glob("*.pdf").each do |orig_name|
    new_name = orig_name.gsub(/^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))/, '20\1\4Q\2\3_\0')
    File.rename(orig_name, new_name)
end

Однако мой сценарий переименования (с использованием brew install rename) в терминале дает неверные результаты.

rename -n -e 's/^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))/'20\1\4Q\2\3_\0'/' *.pdf
'03Q1_FIS.pdf' would be renamed to '2014Q23_0_FIS.pdf'
'03Q1_vIS.pdf' would be renamed to '2014Q23_0_vIS.pdf'
'05Q1 ABC_IS.pdf' would be renamed to '2014Q23_0 ABC_IS.pdf'
'2Q13 ABC MF PM Example_fIS.pdf' would be renamed to '2014Q23_0 ABC MF PM Example_fIS.pdf'

1 Ответ

0 голосов
/ 09 мая 2018

Обновление

rename использует синтаксис Perl для регулярных выражений. После Perl он ожидает, что обратные ссылки будут ссылаться на захваченную группу, в противном случае отображается это предупреждение. Используя регулярные выражения Perl, для этого есть обходной путь: сброс ветви конструкция (?|(...)|(...)|...) и положительный взгляд :

^.*?(?|(\d\d)Q(\d)|Q(\d\d)(?<=(\d)...))

заменить на 20$1Q$2_$&

Распределение регулярных выражений:

  • ^ Соответствует началу входной строки
  • .*? Подберите каждую вещь (без жадности) до ...
  • (?| Начало конструкции сброса ветви
    • (\d\d) Захватить две цифры в группе 1
    • Q Соответствует Q
    • (\d) Захватить цифру в группе 2
    • | или
    • Q Соответствует Q
    • (\d\d) Захватить две цифры в группе 1
    • (?<=(\d)...) Захватить цифру, предшествующую Q в группе 2
  • ) Конец конструкции

Таким образом, обе группы захвата существуют одновременно, первая группа захвата всегда ссылается на 2 цифры, а вторая от 1 до 1, и нам не нужно иметь дело с 4 различными группами захвата.


Вы можете попытаться сопоставить оба шаблона, начиная с шаблона с большим количеством цифр в начале, а затем использовать одну строку замены, которая включает обратные ссылки на все группы захвата по порядку. Вот регулярное выражение:

^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))

и строка замены:

20\1\4Q\2\3_\0

Ruby ( Live демо )

str.gsub(/^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))/, '20\1\4Q\2\3_\0')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...