Используя переименование, сохраняя часть поискового регулярного выражения

Утро,

В текущем проекте, над которым я должен работать, была предыдущая схема именования, которая беспокоит меня ...

Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h

Мне сказали, что «а» в версии заключалось в том, чтобы идентифицировать «альфа» версии, которые требовали дополнительной работы. На этом этапе проекта я могу удалить «а» и заменить его на «.1» (v2a -> v2.1).

Есть много файлов, помимо того, что я готов сделать вручную.

Я знаю, что могу использовать команду переименования, чтобы переименовать все файлы одновременно, но я сталкиваюсь с проблемой, как это сделать. Если я использую что-то вроде:

rename 's/[0-9]a/.1/' *

, тогда я потеряю последнюю цифру номера версии. Есть ли способ, чтобы переименовать (или другой инструмент командной строки) запомнить часть регулярного выражения, используемого для поиска файла? Таким образом, от '[0-9] a' до '[0-9] .1' изменится с 1a на 1,1, с 4a на 4.1 и т. Д.

8
задан 8 January 2018 в 14:17

2 ответа

Вы можете использовать группы захвата :

$ rename -n 's/(\d)a/$1.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

Или вы можете использовать lookbehind :

$ rename -n 's/(?<=\d)a/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

Или аналогично вкратце, утверждение длины 0 \K, что означает «забыть все подходящее до этой точки»:

$ rename -n 's/\d\Ka/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

Обратите внимание, что я использовал более короткое \d вместо [0-9]. Эти два варианта эквивалентны, но rename является сценарием perl, поэтому понимает синтаксис регулярных выражений, совместимых с Perl (PCRE).

Обратите внимание, что это только изменит первое вхождение числа, за которым следует a. Это может или не может быть то, что вам нужно, в зависимости от ваших имен файлов.

-n заставляет rename показать, что он будет делать, фактически ничего не делая. Как только вы подтвердите, что он работает как положено, удалите его, чтобы фактически изменить имена файлов.

15
ответ дан 8 January 2018 в 14:17

Измените команду следующим образом:

rename 's/([0-9])a/$1.1/' *
  • Команда подстановки s/<souce>/<replacement>/ заменит исходную строку (которая может быть регулярным выражением) замещающей строкой.
  • Группы захвата - части исходной строки, заключенные в квадратные скобки: (regexp), (string) и т. Д., Будут назначены в качестве значений последовательных переменных: $1, $2 и т. Д.
  • Таким образом, в строке замены переменная $1 будет расширена со своим значением, которое в этом случае должно совпадать с регулярным выражением [0-9].
8
ответ дан 8 January 2018 в 14:17

Другие вопросы по тегам:

Похожие вопросы: