Usando renomear, mantendo parte da regex de pesquisa

8

Manhã,

O projeto atual em que tenho que trabalhar tinha um esquema de nomes anterior que me incomoda ...

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

Foi-me dito que o "a" na versão era identificar as versões "alfa" que precisavam de mais trabalho. Nesta fase do projeto, posso remover o "a" e substituí-lo por um ".1" (v2a -> v2.1).

Existem muitos arquivos, além do que estou disposto a fazer manualmente.

Sei que poderia usar o comando renomear para renomear todos os arquivos de uma só vez, mas estou com um problema de como fazer isso. Se eu usar algo como:

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

então perderei o último dígito do número da versão. Existe alguma maneira de renomear (ou outra ferramenta de linha de comando) lembrar parte do regex usado para encontrar o arquivo? Assim, '[0-9] a' a '[0-9] .1' mudaria 1a para 1.1 e 4a para 4.1, etc.

inundação
fonte
Isso é uma péssima ideia. Normalmente v2a < v2 < 2.1. Em outras palavras, a versão two-alpha representa a versão anterior à versão dois, não a versão posterior. Seria melhor renomeá-lo para versão 1.99, ou algo semelhante.
jpaugh

Respostas:

15

Você pode 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

Ou você pode usar um 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

Ou, semelhante a um lookback atrás, a afirmação de tamanho 0 \K, que significa "esqueça tudo que correspondeu até este ponto":

$ 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

Observe que eu usei o menor em \dvez de [0-9]. Os dois são equivalentes, mas renameé um script perl, portanto, entende a sintaxe das Expressões Regulares Compatíveis com Perl (PCRE).

Observe que isso mudará apenas a primeira ocorrência de um número seguido por um a. Isso pode ou não ser o que você precisa, dependendo dos nomes dos arquivos.

As -nmarcas renamemostram o que faria sem realmente fazer nada. Depois de confirmar que funciona conforme o esperado, remova-o para alterar os nomes dos arquivos.

Terdon
fonte
8

Modifique o comando desta maneira:

rename 's/([0-9])a/$1.1/' *
  • O comando de s/<souce>/<replacement>/substituição substituirá a sequência de origem (que pode ser uma expressão regular) pela sequência de substituição.
  • Os grupos de captura - as partes da cadeia de origem que estão entre colchetes: (regexp), (string), etc, serão atribuídos como valores das variáveis sucessivas: $1, $2, etc ..
  • Portanto, dentro da cadeia de substituição, a variável $1será expandida com seu valor, que nesse caso deve corresponder ao regexp [0-9].
pa4080
fonte