Làm thế nào để tôi biểu thị sự lặp lại trong regex ZMV?


3

Tôi đang cố gắng tự rút các tài sản ra khỏi tài sản của Rails (đừng hỏi). Tôi đã được chuyển đến ZMV để dễ dàng tìm / thay thế dựa trên regex. Nhưng {32}cú pháp thông thường để chỉ định số lần lặp lại không hoạt động:

$ zmv -n '(**/)(*)' '$1${2//-[A-Za-z0-9]\{32\}/}'

Tôi đã thử một số định dạng khác. Điều này, ví dụ, hoạt động, nhưng quá tham lam (ví dụ, nó sẽ biến image-3.pngthành image.png):

$ zmv -n '(**/)(*)' '$1${2//-[A-Za-z0-9]##\./.}'

Cú pháp băm kép đó chỉ xuất hiện sau rất nhiều Google (tôi đã mong đợi +). Nhưng tôi không thể cho cuộc sống của tôi tìm cách làm {32}việc. Tôi đã thử #32#chưa? Có vẻ như nó hoạt động, nhưng đó là bởi vì nó đang đọc nó như (trong mắt tôi) ?32?và điều đó có nghĩa là nó đã gặp bất cứ thứ gì có ba trong nhân vật tiêu hóa hoặc cuối cùng.

Làm cách nào để biểu thị sự lặp lại ký tự trong zmv?

BIÊN TẬP:

Rõ ràng nó sẽ giúp một số người xem tên tập tin mà tôi đang cố gắng khớp? Để rõ ràng: câu hỏi của tôi là "làm thế nào để tôi biểu thị sự lặp lại ký tự trong zmv" chứ không phải "làm thế nào để tôi khớp các tên tệp này" (một câu hỏi tôi biết câu trả lời theo định dạng RegEx tiêu chuẩn). Nếu nó giúp, đây là dự định của tôi trước và sau:

directory/asset-jej4jtifne9bjkkeuwr09rewrewlur23.css
another-directory/style-748reiodlpqwerntaerwerwerexfzsdf.js.gz
directory/subdirectory/this-is-a-thing-qwertyuiopasdfghjklzxcvbnm123456.js
third-directory/should-not-match-3.css

Nên trở thành:

directory/asset.css
another-directory/style.js.gz
directory/subdirectory/this-is-a-thing.js
third-directory/should-not-match-3.css

EDIT THỨ HAI:

Bởi vì tôi cần phải làm điều này ngày hôm qua, tôi đã làm nó một cách lâu dài và (như mong đợi) nó đã hoạt động. Tôi vẫn muốn biết làm thế nào để tránh nó trong tương lai. Đây là lệnh tôi đã kết thúc bằng cách sử dụng (Tôi đã lặp lại rõ ràng trình so khớp nhân vật của mình 32 lần):

$ zmv '(***/)(*)' '$1${2//-[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]/}'

EDIT THỨ BA:

Đối với bản ghi, tôi đang sử dụng zsh trên OS X. Tôi tưởng tượng zmv giống nhau trên các nền tảng, nhưng tôi không thể nói chắc chắn.


Vui lòng chỉnh sửa câu hỏi của bạn và cung cấp một danh sách các tập tin đầu vào và đầu ra mong muốn của bạn. Bạn cần phải giải thích những gì bạn đang cố gắng để phù hợp, không chỉ đưa ra một regex có thể hoặc không thể làm những gì bạn cần.
terdon

@terdon Tôi nghĩ rằng làm mờ câu hỏi, vì RegEx của tôi đã khớp với tên tệp như mong đợi trên các trang web như rubular.com hoặc trong Ruby, JS, v.v., và câu hỏi của tôi là làm cách nào để làm điều này trong zmv , nhưng tôi đã thêm nếu nó giúp.
Ben Saufley

Đủ công bằng. Tôi chỉ muốn kiểm tra vì tôi) hầu hết người dùng thực sự không biết nhiều về regexes và ii) vì vậy tôi có thể có một cái gì đó để chơi và xem liệu tôi có thể tìm ra nó không. Nhân tiện, trong khi điều này là hoàn hảo về chủ đề ở đây, trong tương lai, bạn có thể muốn xem xét việc đặt câu hỏi như vậy trên Unix & Linux thay thế. Có sự tập trung cao hơn của những người nghiện CLI ở đó, bao gồm khá nhiều chuyên gia zsh.
terdon

Tốt để biết. Tôi không chắc chắn - tôi dành khá nhiều thời gian cho StackOverflow nhưng điều này dường như không đúng ở đó.
Ben Saufley

Câu trả lời:


6

Shell hầu như không cung cấp cú pháp regrec thông thường, nhưng các mẫu hình đại diện trên toàn thế giới. Ký tự đại diện cơ bản không mạnh mẽ như các biểu thức thông thường; ví dụ: biểu thức chính quy .*(bất kỳ chuỗi ký tự nào) tương đương với mẫu hình cầu *nhưng biểu thức chính quy a*(bất kỳ chuỗi nào a) không có mẫu hình cầu tương đương trong sh đơn giản. Xem tại sao biểu thức chính quy của tôi hoạt động trong X mà không phải trong Y? để biết tổng quan về các cú pháp biểu mẫu / biểu thức chính khác nhau.

Zsh có các mẫu hình cầu mở rộng zsh cung cấp sức mạnh biểu cảm giống như các biểu thức thông thường nhưng với cú pháp khác nhau. Các mẫu này được tự động kích hoạt trong zmvvà trong các chức năng hoàn thành, nhưng ở những nơi khác trong zsh chúng cần phải được kích hoạt một cách rõ ràng với setopt extended_glob(đặt nó trong .zshrc- lý do duy nhất không phải là mặc định là tương thích ngược với các phiên bản zsh cổ).

Có một cú pháp lặp lại N lần, nhưng nó hơi bị ẩn, được liệt kê dưới các cờ toàn cầu thay vì trong danh sách các toán tử. Đó là ccờ, phải được sử dụng một mình, theo sau là số lần lặp lại (hoặc hai số được phân tách bằng dấu phẩy để đưa ra một phạm vi).

zmv -n '(**/)(*)' '$1${2//-[A-Za-z0-9](#c32)/}'

(#c32)là những gì tôi đang tìm kiếm! Tuyệt vời! Cám ơn rất nhiều. Tôi thực sự cần phải đọc lên trên ảm đạm nói chung.
Ben Saufley

PS Tôi nghĩ rằng hậu tố #sẽ không phải là thứ tôi đang tìm kiếm vì nó sẽ khớp với should-not-match-3.csstệp và xóa -3, điều mà tôi không muốn.
Ben Saufley

Nhận xét cuối cùng: "Tại sao biểu thức chính quy của tôi hoạt động trong X mà không phải là Y" là một tài nguyên tuyệt vời mà tôi đã tìm kiếm trong nhiều năm. Cảm ơn bạn!
Ben Saufley

1

Tôi không thể làm cho nó hoạt động với zmvmột trong hai. Phải có một cách nhưng nó thoát khỏi tôi. Tuy nhiên, zmvkhông phải là công cụ duy nhất có thể làm điều gì đó như thế. Bạn cũng có thể sử dụng rename.

  • Nếu bạn đang sử dụng zsh

    $ rename -n 's/-[A-Za-z0-9]{32}//' **/* 
    another-directory/style-748reiodlpqwerntaerwerwerexfzsdf.js.gz renamed as another-directory/style.js.gz
    directory/asset-jej4jtifne9bjkkeuwr09rewrewlur23.css renamed as directory/asset.css
    directory/subdirectory/this-is-a-thing-qwertyuiopasdfghjklzxcvbnm123456.js renamed as directory/subdirectory/this-is-a-thing.js
  • Nếu bạn đang sử dụng bash

    $ shopt -s globstar 
    $ rename -n 's/-[A-Za-z0-9]{32}//' **/* 
    another-directory/style-748reiodlpqwerntaerwerwerexfzsdf.js.gz renamed as another-directory/style.js.gz
    directory/asset-jej4jtifne9bjkkeuwr09rewrewlur23.css renamed as directory/asset.css
    directory/subdirectory/this-is-a-thing-qwertyuiopasdfghjklzxcvbnm123456.js renamed as directory/subdirectory/this-is-a-thing.js

Lưu ý rằng có hai renamelệnh trong thế giới Linux. Các ví dụ ở trên sử dụng Perl, một mặc định trên các bản phân phối dựa trên Debian.


Lý do bạn không thể làm việc zmvnày là vì tôi không phải zmvlà nó diễn giải biểu thức, đó là một tính năng vỏ và do đó ii) đó không phải là một biểu thức chính quy, đó là một hình cầu.

Khi bạn chạy lệnh trong câu hỏi của mình, zmvđặt $2thành từng tên tệp và sau đó là vỏ chạy thay thế ( ${2//...). Khi biến đã được mở rộng bởi shell, nó được trả về để zmvthử hoạt động đổi tên.

Giống như Korn shell và bash, zsh hỗ trợ các ${foo//bar}định dạng mà sẽ loại bỏ tất cả các trận đấu của glob bartừ biến $foo(tương phản với ${foo/bar}đó sẽ chỉ loại bỏ các trận đấu đầu tiên). Nó hoạt động như thế này:

% foo="Xababab"
% echo ${foo//ab}
X
% echo ${foo//a*b}
X

Như bạn có thể thấy ở trên, các mẫu là các khối và không phải là biểu thức chính quy. Toàn cầu a*b có nghĩa là "khớp a, sau đó 0 hoặc nhiều ký tự và sau đó b". Nó là tương đương với biểu thức chính quy này : a.*b.Globs, không giống như regexes, không hỗ trợ sự lặp lại(Rõ ràng, sự hả hê của zsh làm, xem câu trả lời của Gilles ). Các x{n}cú pháp sẽ không phù hợp n lần lặp lại của x. Do đó, đây là lý do tại sao regex của bạn thất bại: nó không được hiểu là một regex nào cả!


Trong lúc tôi đang tìm kiếm các đề xuất để sử dụng renamenhưng zsh không nhận ra điều đó đối với tôi - có lẽ vì tôi đang ở OS X chứ không phải Linux. Tôi sẽ thêm chi tiết đó ở trên. Một số người khác nói với tôi rằng tôi có thể brew install rename, điều đó đã cứu tôi tất cả những rắc rối này. Upvote vì điều này giải quyết vấn đề thực tế của tôi. Tôi vẫn muốn biết liệu có cách nào để làm điều này trong zmv không .
Ben Saufley

1
@BenSaufley vâng, tôi cũng vậy. Thật kỳ lạ khi không có giải pháp rõ ràng nào hoạt động. Tôi đã hỏi một trong những chuyên gia zsh thường trú của chúng tôi về U & L trong trò chuyện và đưa ra liên kết đến câu hỏi này. Chúng tôi sẽ xem liệu anh ấy có trả lời không. Nghiêm túc mà nói, lần tới khi bạn có câu hỏi liên quan đến zsh, hãy hỏi trên U & L. Chúng tôi có một vài người cuồng zsh ở đó, những người sẽ luôn trả lời các câu hỏi của zsh và những người hiểu biết một cách lố bịch về nó.
terdon

Cảm ơn vì tiền hỗ trợ; Tôi chắc chắn sẽ. Có quá nhiều thứ để học!
Ben Saufley

@BenSaufley tôi đã tìm ra nó. Tôi nên nhận ra sớm hơn, đó không phải là một regex, đó là một quả địa cầu và những quả cầu không được lặp lại. Xem câu trả lời cập nhật.
terdon

1
@BenSaufley chuyên gia tôi gọi đã trả lời. Xin vui lòng chấp nhận câu trả lời của anh ấy vì anh ấy cung cấp cách để làm điều đó bằng cách sử dụng các công cụ bạn muốn.
terdon
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.