Verwenden Sie beim Umbenennen einen Teil des regulären Regex der Suche

8

Morgen,

Das aktuelle Projekt, an dem ich arbeiten muss, hatte ein vorheriges Namensschema, das mich stört ...

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

Mir wurde gesagt, dass das "a" in der Version "Alpha" -Versionen identifizieren soll, die mehr Arbeit benötigen. In dieser Phase des Projekts kann ich das "a" entfernen und durch ein ".1" ersetzen (v2a -> v2.1).

Es gibt viele Dateien, die über das hinausgehen, was ich manuell tun möchte.

Ich weiß, dass ich den Befehl umbenennen verwenden kann, um alle Dateien gleichzeitig umzubenennen, aber ich habe ein Problem damit. Wenn ich so etwas benutze wie:

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

dann werde ich die letzte Ziffer der Versionsnummer verlieren. Gibt es eine Möglichkeit, das Umbenennen (oder ein anderes Befehlszeilentool) an einen Teil des regulären Ausdrucks zu erinnern, der zum Suchen der Datei verwendet wurde? Damit '[0-9] a' zu '[0-9] .1' 1a zu 1.1 und 4a zu 4.1 usw. ändert.

Holz
quelle
Das ist eine schlechte Idee. Normalerweise v2a < v2 < 2.1. Mit anderen Worten, Version zwei-Alpha repräsentiert die Version, die zu Version zwei führt, nicht die Version danach. Es wäre besser, es in Version 1.99oder ähnliches umzubenennen .
Jpaugh

Antworten:

15

Sie können entweder Erfassungsgruppen verwenden :

$ 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

Oder Sie können ein Lookbehind verwenden :

$ 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

Oder, ähnlich wie bei einem Lookbehind, die Behauptung \Kmit der Länge 0 , was bedeutet, dass "alles vergessen wurde, was bis zu diesem Punkt übereinstimmt":

$ 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

Beachten Sie, dass ich die kürzere \danstelle von verwendet habe [0-9]. Die beiden sind gleichwertig, stellen jedoch renameein Perl-Skript dar und verstehen daher die Syntax von Perl Compatible Regular Expressions (PCRE).

Beachten Sie, dass dies nur das erste Auftreten einer Zahl gefolgt von einem ändert a. Dies kann abhängig von Ihren Dateinamen sein oder auch nicht.

Die -nMarken renamezeigen, was es tun würde, ohne etwas zu tun. Wenn Sie bestätigt haben, dass es wie erwartet funktioniert, entfernen Sie es, um die Dateinamen tatsächlich zu ändern.

Terdon
quelle
8

Ändern Sie den Befehl folgendermaßen:

rename 's/([0-9])a/$1.1/' *
  • Der Ersetzungsbefehl s/<souce>/<replacement>/ersetzt die Quellzeichenfolge (die ein regulärer Ausdruck sein kann) durch die Ersetzungszeichenfolge.
  • Die Fänger - Gruppen - die Teile der Quellzeichenfolge , die mit Klammern sind: (regexp), (string)usw. werden als Werte von aufeinanderfolgenden Variablen zugewiesen werden: $1, $2, etc ..
  • Innerhalb der Ersetzungszeichenfolge wird die Variable $1also um ihren Wert erweitert, der in diesem Fall mit dem regulären Ausdruck übereinstimmen muss [0-9].
pa4080
quelle