2009-04-30 34 views

Trả lời

8

Nó không phải là lỗi và nó hoạt động tốt trong các từ. Sự cố bạn gặp phải ở đây là {1..9} không phải là biểu thức ký tự đại diện như *; như ví dụ echo của bạn cho thấy, đó là một mở rộng lặp đi lặp lại. Vì vậy, ví dụ zgrep của bạn là chính xác giống như nếu bạn đã gõ mỗi phiên bản thay thế vào dòng lệnh, và sau đó vì không có trang người đàn ông bắt đầu với zsh trong man2, nó lỗi ra. (Nó erroring ra trên một thất bại để tìm một trận đấu, chứ không phải bất cứ điều gì về bản chất liên quan đến việc mở rộng chuỗi nẹp của quý vị.)

Nếu bạn đã làm điều này, mặt khác:

zgrep -c compinit /usr/share/man/man[1-9]/zsh* 

bạn muốn có được kết quả bạn mong đợi, bởi vì [1-9] là một biểu thức ký tự đại diện bình thường.

+0

Vì vậy, chúng tôi có hai dấu cách: một là không ký tự đại diện và một là không gian ký tự đại diện. Nếu có một ký tự đại diện, nó buộc tôi chỉ sử dụng các ký tự đại diện. Trong cùng một cách, bạn chỉ có thể sử dụng ký tự không phải ký tự đại diện. - - Cảm ơn bạn vì câu trả lời! –

+2

@Masi: Không hoàn toàn. Nếu tôi có một thư mục với 1-hello.gif, 2-world.gif, ..., 20-foobar.gif, '{1..20} - *. Gif' sẽ hoạt động hoàn hảo để phù hợp với chúng, trong khi' [1-20] - *. Gif' sẽ chỉ khớp với hai chữ cái đầu tiên. Điều này sẽ gây ra lỗi tương tự như trong câu hỏi của bạn nếu bất kỳ tệp tuần tự đánh số nào bị thiếu. – ephemient

+0

@ephemient: Bạn có nghĩa là [1-20] Tệp không hoạt động nếu bạn không có, ví dụ, 7File? - Nếu vậy, lợi ích của việc sử dụng [1-20] thay vì {1..20} là gì không gây ra vấn đề cho bạn? –

6

Trong zsh, nếu bạn muốn sử dụng các phạm vi trong tên tệp, zle cung cấp <1-n> trên bất kỳ tên thật nào mà nó có thể mở rộng. Đó là để nói:

$ touch a0b a1b a5b a7b 
$ print a<0-100>b 

Và sau đó nhấn <Tab> ngay sau khi trận chung kết b sẽ để lại cho bạn với print a0b a1b a5b a7b mở rộng trên đường dây.

Đối với tất cả ý nghĩa khác và mục đích - có lẽ đầy đủ yêu cầu về phạm vi, phi tập tin và sử dụng kịch bản - Tôi muốn thể hiện điều này bằng cách sử dụng vòng lặp zsh thành ngữ khá ngắn gọn như sau:

for n ({1..50}); do print $n; done 

sẽ cho phép bạn xử lý toàn bộ dãy thứ tự của các số từ 1 đến 50 :) sau đó bạn có thể thực hiện tất cả các loại nội dung hữu ích, chẳng hạn như tập hợp tệp chưa tồn tại:

arr=($(for n ({1..50}); do print /my/path/file$n.txt; done)) && print $arr[33] 
Các vấn đề liên quan