Usando renomear, mantendo parte da regex de pesquisa

7

Bom dia,

O projeto atual em que tenho que trabalhar tem um esquema de nomenclatura 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 para identificar versões "alfa" que precisavam de mais trabalho. Neste estágio do projeto, posso remover o "a" e substituí-lo por ".1" (v2a - > v2.1).

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

Eu 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 ter renomear (ou outra ferramenta de linha de comando) lembre-se parte do regex usado para encontrar o arquivo? Então, '[0-9] a' to '[0-9] .1' mudaria de 1a para 1.1 e de 4a para 4.1, etc.

    
por swood 08.01.2018 / 12:17

2 respostas

13

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 lookbehind, a asserção 0-length \K , que significa "esqueça tudo combinado 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 usei o menor \d em vez 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 só alterará 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.

O -n faz com que rename mostre o que faria sem realmente fazer nada. Depois de confirmar que funciona como esperado, remova-o para alterar os nomes dos arquivos.

    
por terdon 08.01.2018 / 12:29
6

Modifique o comando desta forma:

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