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

Утро,

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

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

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

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

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

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

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

7
задан 8 January 2018 в 15:17

6 ответов

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

$ 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

Или, аналогично lookbehind, утверждение длины 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

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

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

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

12
ответ дан 22 May 2018 в 15:41

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

$ 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

Или, аналогично lookbehind, утверждение длины 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

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

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

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

13
ответ дан 17 July 2018 в 23:37

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

$ 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

Или, аналогично lookbehind, утверждение длины 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

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

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

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

13
ответ дан 24 July 2018 в 17:04

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

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

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

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

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

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

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

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