Menggunakan rename, pertahankan bagian dari regex pencarian


8

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.


Itu ide yang buruk. Biasanya 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 versi 1.99, atau yang serupa.
jpaugh

Jawaban:


15

Anda dapat menggunakan grup tangkap :

$ 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

Atau Anda dapat menggunakan 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

Atau, mirip dengan yang terlihat di belakang, pernyataan 0-length \K, yang berarti "lupakan semuanya cocok sampai saat ini":

$ 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

Perhatikan bahwa saya menggunakan yang lebih pendek \dsebagai gantinya [0-9]. Keduanya setara, tetapi renamemerupakan 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 -nmerek renamemenunjukkan 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.


8

Ubah perintah dengan cara ini:

rename 's/([0-9])a/$1.1/' *
  • Perintah substitusi s/<souce>/<replacement>/akan mengganti string sumber (yang bisa menjadi ekspresi reguler) dengan string pengganti.
  • Penangkapan kelompok - bagian dari string sumber yang tertutup dengan kurung: (regexp), (string), dll akan ditugaskan sebagai nilai-nilai variabel yang berurutan: $1, $2, dll ..
  • Jadi, dalam string pengganti, variabel $1akan diperluas dengan nilainya, yang dalam hal ini harus cocok dengan regexp [0-9].
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.