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.
fonte
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ão1.99
, ou algo semelhante.Respostas:
Você pode usar grupos de captura :
Ou você pode usar um lookbehind :
Ou, semelhante a um lookback atrás, a afirmação de tamanho 0
\K
, que significa "esqueça tudo que correspondeu até este ponto":Observe que eu usei o menor em
\d
vez de[0-9]
. Os dois são equivalentes, masrename
é 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
-n
marcasrename
mostram o que faria sem realmente fazer nada. Depois de confirmar que funciona conforme o esperado, remova-o para alterar os nomes dos arquivos.fonte
Modifique o comando desta maneira:
s/<souce>/<replacement>/
substituição substituirá a sequência de origem (que pode ser uma expressão regular) pela sequência de substituição.(regexp)
,(string)
, etc, serão atribuídos como valores das variáveis sucessivas:$1
,$2
, etc ..$1
será expandida com seu valor, que nesse caso deve corresponder ao regexp[0-9]
.fonte