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

8

Утро,

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

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 и т. Д.

SWOOD
источник
Это плохая идея. Обычно v2a < v2 < 2.1. Другими словами, версия two-alpha представляет версию, приводящую ко второй версии, а не версию после нее. Было бы лучше переименовать его в версию 1.99или что-то подобное.
jpaugh

Ответы:

15

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

$ 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

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

$ 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показывает , что он будет делать на самом деле , не делая ничего. Как только вы подтвердите, что он работает как положено, удалите его, чтобы фактически изменить имена файлов.

terdon
источник
8

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

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