Sử dụng đổi tên, giữ một phần của biểu thức tìm kiếm


8

Buổi sáng,

Dự án hiện tại tôi phải thực hiện đã có một kế hoạch đặt tên trước đó làm phiền tôi ...

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

Tôi đã được thông báo "a" trong phiên bản là xác định các phiên bản "alpha" cần nhiều công việc hơn. Ở giai đoạn này trong dự án tôi có thể loại bỏ "a" và thay thế nó bằng ".1" (v2a -> v2.1).

Có rất nhiều tập tin, ngoài những gì tôi sẵn sàng làm thủ công.

Tôi biết tôi có thể sử dụng lệnh đổi tên để đổi tên tất cả các tệp cùng một lúc, nhưng tôi đang gặp vấn đề với cách thực hiện điều đó. Nếu tôi sử dụng một cái gì đó như:

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

sau đó tôi sẽ mất chữ số cuối của số phiên bản. Có cách nào để đổi tên (hoặc một công cụ dòng lệnh khác) nhớ một phần của biểu thức chính được sử dụng để tìm tệp không? Vì vậy, '[0-9] a' thành '[0-9] .1' sẽ thay đổi 1a thành 1.1 và 4a thành 4.1, v.v.


Đó là một ý tưởng tồi. Thông thường v2a < v2 < 2.1. Nói cách khác, phiên bản hai-alpha đại diện cho phiên bản dẫn đến phiên bản hai, không phải phiên bản sau nó. Sẽ tốt hơn nếu đổi tên nó thành phiên bản 1.99, hoặc một cái gì đó tương tự.
jpaugh

Câu trả lời:


15

Bạn có thể sử dụng các nhóm chụp :

$ 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

Hoặc bạn có thể sử dụng một cái nhìn :

$ 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

Hoặc, tương tự như một cái nhìn, xác nhận độ dài 0 \K, có nghĩa là "quên mọi thứ khớp cho đến thời điểm này":

$ 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

Lưu ý rằng tôi đã sử dụng ngắn hơn \dthay vì [0-9]. Hai cái này tương đương nhau, nhưng renamelà một tập lệnh perl, vì vậy hiểu cú pháp của Biểu thức chính quy tương thích Perl (PCRE).

Lưu ý rằng điều này sẽ chỉ thay đổi lần xuất hiện đầu tiên của một số theo sau là một a. Điều này có thể hoặc không thể là những gì bạn cần, tùy thuộc vào tên tệp của bạn.

Điều này -ncho renamethấy những gì nó sẽ làm mà không thực sự làm bất cứ điều gì. một khi bạn đã xác nhận rằng nó hoạt động như mong đợi, hãy xóa nó để thực sự thay đổi tên tệp.


8

Sửa đổi lệnh theo cách này:

rename 's/([0-9])a/$1.1/' *
  • Lệnh thay thế s/<souce>/<replacement>/sẽ thay thế chuỗi nguồn (có thể là biểu thức chính quy) bằng chuỗi thay thế.
  • Các nhóm chụp - các bộ phận của chuỗi nguồn được kèm theo dấu ngoặc: (regexp), (string), vv sẽ được chỉ định như các giá trị của các biến liên tiếp: $1, $2, vv ..
  • Vì vậy, trong chuỗi thay thế, biến $1sẽ được mở rộng với giá trị của nó, trong trường hợp này phải khớp với biểu thức chính quy [0-9].
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.