Usando rename, manteniendo parte de la expresión regular de búsqueda

8

Mañana,

El proyecto actual en el que tengo que trabajar tenía un esquema de nombres anterior que me molesta ...

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

Me dijeron que la "a" en la versión era identificar versiones "alfa" que necesitaban más trabajo. En esta etapa del proyecto, puedo eliminar la "a" y reemplazarla por una ".1" (v2a -> v2.1).

Hay muchos archivos, más allá de lo que estoy dispuesto a hacer manualmente.

Sé que podría usar el comando rename para cambiar el nombre de todos los archivos a la vez, pero me encuentro con un problema sobre cómo hacerlo. Si uso algo como:

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

entonces perderé el último dígito del número de versión. ¿Hay alguna forma de cambiar el nombre (u otra herramienta de línea de comando) para recordar parte de la expresión regular utilizada para encontrar el archivo? De modo que '[0-9] a' a '[0-9] .1' cambiaría 1a a 1.1, y 4a a 4.1, etc.

swood
fuente
Esa es una mala idea. Por lo general v2a < v2 < 2.1. En otras palabras, la versión dos alfa representa la versión anterior a la versión dos, no la versión posterior. Sería mejor cambiarle el nombre a versión 1.99, o algo similar.
jpaugh

Respuestas:

15

Puede usar grupos de captura :

$ 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

O puede usar un vistazo atrás :

$ 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

O, de forma similar a una mirada atrás, la afirmación de longitud 0 \K, que significa "olvidar todo lo que coincidió hasta este punto":

$ 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

Tenga en cuenta que usé el más corto en \dlugar de [0-9]. Los dos son equivalentes, pero renamees un script perl, por lo que comprende la sintaxis de las expresiones regulares compatibles con Perl (PCRE).

Tenga en cuenta que esto solo cambiará la primera aparición de un número seguido de un a. Esto puede o no ser lo que necesita, dependiendo de los nombres de sus archivos.

Las -nmarcas renamemuestran lo que haría sin realmente hacer nada. una vez que haya confirmado que funciona como se esperaba, elimínelo para cambiar realmente los nombres de archivo.

terdon
fuente
8

Modifique el comando de esta manera:

rename 's/([0-9])a/$1.1/' *
  • El comando de sustitución s/<souce>/<replacement>/reemplazará la cadena de origen (que podría ser una expresión regular) con la cadena de reemplazo.
  • Los grupos de captura - las partes de la cadena de origen que se incluye con paréntesis: (regexp), (string), etc. serán asignados como valores de las variables sucesivas: $1, $2, etc ..
  • Entonces, dentro de la cadena de reemplazo, la variable $1se expandirá con su valor, que en este caso debe coincidir con la expresión regular [0-9].
pa4080
fuente