2013-01-09 11 views
6

Tôi đang viết một tập lệnh Bash để dọn dẹp trong âm nhạc của mình.Linux Đổi tên lệnh chữ hoa đầu tiên

tôi muốn nó để định dạng tất cả các tên tập tin và làm cho chúng và như vậy với một tìm kiếm internet chút tôi đã viết dòng này:

sed -i -e 's/[-_]/ /g' -e 's/ \+/ /g' -e **'s/\<[a-z]/\U&/g'** -e "s/$artist //g" -e "s/$album //g" 

Mà tôi sử dụng để thêm các tên tập tin vào một tập tin văn bản và sau đó sed nhưng sau đó tôi không biết cách áp dụng tên mới cho các tệp.

Vì vậy, sau đó tôi bắt đầu thử nghiệm với đổi tên và quản lý để có được kết quả chính xác tương tự ngoại trừ các phần in đậm, được cho là để làm cho mỗi chữ cái đầu tiên trong một chữ hoa.

rename 's/[-_]/ /g' * && rename 's/\s+/ /g' * && **rename 's/\s\w{1}/*A-Z*/g' *** && rename 's/^\d+[[:punct:]]\s//g' * && rename "s/$artist\s//g" * && rename "s/$album\s//g" * && rename "s/($ext)//g" * 

Bây giờ, mã đổi tên đang hoạt động (ít nhất là thỏa đáng), chỉ tìm một chữ cái sau ký tự SPACE, nhưng đó là sự thay thế có vấn đề. Tôi đã thử nhiều cách tiếp cận khác nhau, tất cả để lại cho tôi kết quả là chữ cái đầu tiên trong tiêu điểm được trao đổi chính xác với A-Z trong trường hợp này.

Trong trang hướng dẫn đổi tên, nó nói để viết hoa chữ thường bạn làm 's/a-z/A-Z/g' nhưng dễ dàng chỉ ra rằng nó chỉ áp dụng khi tìm a-z A-Z. Vì vậy, đây là những gì tôi cần trợ giúp. Tiền thưởng sẽ là nếu ai đó biết cách làm như trong ví dụ sed, trong đó \ < khớp với đầu mỗi từ, bởi vì tại thời điểm này, lệnh đổi tên của tôi sẽ không áp dụng cho từ đầu tiên và nó sẽ không áp dụng nếu có nhiều đĩa trông giống như "Disc name [Disc 1]" vì những lý do hiển nhiên.

+0

Tôi nhận thấy bạn giữ "đăng xuất" trên bài đăng của mình. [Đừng làm vậy.] (Http://stackoverflow.com/faq#signatures) – chrisaycock

+0

Nếu bạn có một tệp văn bản với cặp tên nguồn và tên đích đã có, 'sed 's/^/mv /' textfile | sh' là tất cả những gì bạn cần (mặc dù trích dẫn tên tập tin với dấu cách, vv làm phức tạp mọi thứ; đây chỉ là bằng chứng về khái niệm chứ không phải là câu trả lời thực tế). – tripleee

Trả lời

3

này trông cho sự khởi đầu của chuỗi \A hoặc cho khoảng trắng \s tiếp theo ít nhất một hoặc nhiều ký tự chữ (a-z, 0-9, dấu gạch dưới) \w+. Nó sẽ viết hoa ký tự đầu tiên của tất cả các chuỗi từ.

7

Đây là loại câu hỏi Perl, vì rename được viết bằng Perl và hướng dẫn cách thực hiện đổi tên là lệnh Perl.

Trong một số s/// để người thay thế biết được chữ cái nào để chèn phiên bản chữ hoa, nó phải 'chụp' thư từ đầu vào. Dấu ngoặc đơn trong mẫu thực hiện việc này, lưu trữ thư bị bắt trong biến $1. Và \u trong một sự thay thế làm cho nhân vật tiếp theo trên trường hợp.

Vì vậy, bạn có thể làm:

$ rename 's/\s(\w)/ \u$1/g' * 

Lưu ý rằng phần thay thế có để chèn một dấu cách trước lá thư chữ hoa, bởi vì mô hình bao gồm một không gian và vì vậy cả hai không gian và chữ gốc đang được thay thế. Bạn có thể tránh điều này bằng cách sử dụng \b, một sự khẳng định zero-chiều rộng mà chỉ phù hợp tại một ranh giới từ:

$ rename 's/\b(\w)/\u$1/g' * 

Ngoài ra bạn không cần {1} trong đó, bởi vì \w (như biểu tượng khác trong regexs) phù hợp với một ký tự đơn theo mặc định.

Cuối cùng, ví dụ trong đổi tên (1) thực sự là y/A-Z/a-z/, sử dụng y/// điều hành, không s///. y/// là một toán tử hoàn toàn khác, thay thế tất cả các lần xuất hiện của một tập hợp các chữ cái với nhau; đó không phải là sử dụng cho bạn ở đây, nơi mà nó chỉ là một số nhân vật bạn muốn làm cho trường hợp trên.

+0

Cảm ơn bạn đã giải thích kỹ lưỡng. Nó đã giúp tôi ồ ạt đạt được mục tiêu của mình. Tôi redid toàn bộ công thức thay thế của tôi và kết thúc với đổi tên 's/(\ w) (\ w {1,})/\ u $ 1 $ 2/g' *, tìm kiếm một bức thư và chụp nó trong $ 1, IF và chỉ nếu thư đó được theo sau bởi ít nhất một chữ cái khác, và sau đó nó viết hoa $ 1 và in phần còn lại của từ ra bằng cách sử dụng $ 2. Tôi đã có một số vấn đề tìm ra điều này, với ranh giới \ b và đọc rằng nó sẽ không phù hợp với hai ký tự chữ cái sau mỗi khác, nhưng \ B đã làm, mặc dù điều đó không làm việc ... Tôi không chắc chắn lý do tại sao tại điểm này. – Jompa

+0

‘1 hoặc hơn’ là một yêu cầu chung, do đó, có biểu tượng riêng của nó, '+'. Bạn có thể viết '\ w +' thay vì '\ w {1,}'. – Smylers

+0

'\ b' khớp với quá trình chuyển đổi từ ký tự từ sang ký tự không phải từ (hoặc ngược lại). '\ B' là đối diện, khớp với bất kỳ nơi nào khác. Vì vậy, '/ \ b \ w \ B /' khớp với một ký tự từ mà không phải có một ký tự từ trước nó, nhưng có một ký tự từ sau nó. Ý nghĩa 's/\ b (\ w) \ B/\ u $ 1/g' có tác dụng tương tự như công thức của bạn, nhưng không bận tâm lấy ra các ký tự thứ hai và tiếp theo của các từ chỉ để đưa chúng trở lại. – Smylers