Pagi,
Proyek saat ini saya harus kerjakan memiliki skema penamaan sebelumnya yang mengganggu saya ...
Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h
Saya telah diberitahu "a" dalam versi itu untuk mengidentifikasi "alpha" versi yang membutuhkan lebih banyak pekerjaan. Pada tahap ini dalam proyek saya dapat menghapus "a" dan menggantinya dengan ".1" (v2a -> v2.1).
Ada banyak file, di luar apa yang ingin saya lakukan secara manual.
Saya tahu saya bisa menggunakan perintah rename untuk mengganti nama semua file sekaligus, tetapi saya mengalami masalah dengan cara melakukan itu. Jika saya menggunakan sesuatu seperti:
rename 's/[0-9]a/.1/' *
maka saya akan kehilangan digit terakhir dari nomor versi. Apakah ada cara untuk mengganti nama (atau alat baris perintah lain) mengingat bagian dari regex yang digunakan untuk menemukan file? Sehingga '[0-9] a' ke '[0-9] .1' akan mengubah 1a menjadi 1.1, dan 4a menjadi 4.1, dll.
sumber
v2a < v2 < 2.1
. Dengan kata lain versi two-alpha mewakili versi yang mengarah ke versi dua, bukan versi setelahnya. Akan lebih baik untuk mengubah nama ke versi1.99
, atau yang serupa.Jawaban:
Anda dapat menggunakan grup tangkap :
Atau Anda dapat menggunakan lookbehind :
Atau, mirip dengan yang terlihat di belakang, pernyataan 0-length
\K
, yang berarti "lupakan semuanya cocok sampai saat ini":Perhatikan bahwa saya menggunakan yang lebih pendek
\d
sebagai gantinya[0-9]
. Keduanya setara, tetapirename
merupakan skrip perl, jadi pahami sintaks Perl Compatible Regular Expressions (PCRE).Perhatikan bahwa ini hanya akan mengubah kemunculan pertama angka diikuti oleh
a
. Ini mungkin atau mungkin bukan yang Anda butuhkan, tergantung pada nama file Anda.The
-n
merekrename
menunjukkan apa yang akan dilakukan tanpa benar-benar melakukan apa-apa. setelah Anda mengonfirmasi bahwa itu berfungsi seperti yang diharapkan, hapus untuk benar-benar mengubah nama file.sumber
Ubah perintah dengan cara ini:
s/<souce>/<replacement>/
akan mengganti string sumber (yang bisa menjadi ekspresi reguler) dengan string pengganti.(regexp)
,(string)
, dll akan ditugaskan sebagai nilai-nilai variabel yang berurutan:$1
,$2
, dll ..$1
akan diperluas dengan nilainya, yang dalam hal ini harus cocok dengan regexp[0-9]
.sumber