Використовуючи перейменування, зберігаючи частину пошуку


8

Ранок,

У поточному проекті, над яким я повинен працювати, була попередня схема іменування, яка мене турбує ...

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

Мені сказали, що "а" у версії було визначити "альфа" версії, які потребують додаткової роботи. На цьому етапі проекту я можу видалити "a" і замінити його на ".1" (v2a -> v2.1).

Файлів дуже багато, крім того, що я готовий робити вручну.

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

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

тоді я втрачу останню цифру номера версії. Чи є спосіб перейменувати (чи інший інструмент командного рядка) запам'ятати частину регулярного виразу, який використовується для пошуку файлу? Так що "[0-9] a" до "[0-9] .1" змінив би 1a на 1.1, а 4a - 4.1 та ін.


Це погана ідея. Зазвичай v2a < v2 < 2.1. Іншими словами, версія два-альфа являє собою версію, що веде до другої версії, а не версію після неї. Краще було б перейменувати його на версію 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 Compatible Regular Express (PCRE).

Зауважте, що це змінить лише перше виникнення числа, за яким слідує а a. Це може бути, а може і не бути тим, що вам потрібно, залежно від назв ваших файлів.

На -nмарці renameпоказує , що він буде робити на самому ділі , не роблячи нічого. як тільки ви підтвердите, що він працює, як очікувалося, видаліть його, щоб фактично змінити імена файлів.


8

Змініть команду таким чином:

rename 's/([0-9])a/$1.1/' *
  • Команда supstitution s/<souce>/<replacement>/замінить початковий рядок (який може бути регулярним виразом) на рядок заміни.
  • Групи захоплення - частини початкового рядка , які укладені в квадратні дужки: (regexp), (string)і т.д. , будуть призначені в якості значень послідовних змінних $1, $2і т.д ..
  • Отже, в межах рядка заміни змінна $1буде розширена своїм значенням, що в цьому випадку має збігатися з регулярним виразом [0-9].
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.