Utiliser renommer, conserver une partie de l'expression rationnelle de recherche

8

Matin,

Le projet actuel sur lequel je dois travailler avait un schéma de nommage précédent qui me dérange ...

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

On m'a dit que le "a" dans la version était d'identifier les versions "alpha" qui nécessitaient plus de travail. À ce stade du projet, je peux supprimer le "a" et le remplacer par un ".1" (v2a -> v2.1).

Il y a beaucoup de fichiers, au-delà de ce que je suis prêt à faire manuellement.

Je sais que je pourrais utiliser la commande rename pour renommer tous les fichiers à la fois, mais je rencontre un problème avec la façon de le faire. Si j'utilise quelque chose comme:

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

alors je perdrai le dernier chiffre du numéro de version. Existe-t-il un moyen pour que renommer (ou un autre outil en ligne de commande) se souvienne d'une partie de l'expression rationnelle utilisée pour rechercher le fichier? Ainsi, «[0-9] a» à «[0-9] .1» changerait 1a en 1.1, et 4a en 4.1, etc.

swood
la source
C'est une mauvaise idée. Habituellement v2a < v2 < 2.1. En d'autres termes, la version deux-alpha représente la version menant à la version deux, pas la version qui la suit. Il serait préférable de le renommer en version 1.99, ou quelque chose de similaire.
jpaugh

Réponses:

15

Vous pouvez soit utiliser des groupes de capture :

$ 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 vous pouvez utiliser un 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, semblable à un lookbehind, l'affirmation de longueur 0 \K, qui signifie "oublier tout ce qui a correspondu jusqu'à ce point":

$ 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

Notez que j'ai utilisé le plus court \dau lieu de [0-9]. Les deux sont équivalents, mais renamec'est un script perl, donc comprend la syntaxe des expressions régulières compatibles Perl (PCRE).

Notez que cela ne changera que la première occurrence d'un nombre suivi d'un a. Cela peut ou non être ce dont vous avez besoin, selon vos noms de fichiers.

Les -nmarques renamemontrent ce que cela ferait sans rien faire. une fois que vous avez confirmé qu'il fonctionne comme prévu, supprimez-le pour modifier réellement les noms de fichiers.

terdon
la source
8

Modifiez la commande de cette manière:

rename 's/([0-9])a/$1.1/' *
  • La commande de substitution s/<souce>/<replacement>/remplacera la chaîne source (qui pourrait être une expression régulière) par la chaîne de remplacement.
  • Les groupes de capture - les parties de la chaîne source qui sont inclus entre parenthèses: (regexp), (string), etc. seront affectés en tant que valeurs de variables successives: $1, $2, etc ..
  • Ainsi, dans la chaîne de remplacement, la variable $1sera développée avec sa valeur, qui dans ce cas doit correspondre à l'expression rationnelle [0-9].
pa4080
la source