2011-01-29 45 views
12

Tôi đã nhận thấy trong một thời gian hiện tại, trên một số hệ thống dựa trên Unix tôi sử dụng ít nhất, ls [A-Z]* đã mang lại cho tôi kết quả tôi mong đợi từ ls [A-Za-z]*, khiến tôi không thể dễ dàng có được danh sách các tệp bắt đầu bằng chữ in hoa. Tôi vừa chạy vào cùng một điều với grep, nơi tôi không thể làm cho nó ngừng phù hợp với chữ cái thường với [A-Z] cho đến khi tôi cuối cùng sử dụng grep -P để có được Perl regex.Điều gì xảy ra với [A-Z] có nghĩa là [A-Za-z]?

Vì vậy, tôi có một số câu hỏi liên quan:

  1. Khi đã ngu ngốc này bắt đầu?
  2. Ai chịu trách nhiệm và cần phải bị trừng phạt?
  3. TẠI SAO ???
  4. Có cách giải quyết đơn giản hợp lý nào cho một hoặc cả hai trường hợp lsgrep không? (Cố gắng, ví dụ, grep --no-ignore-case là không kết quả. grep -P không phải là một cách giải quyết rất tốt vì tình trạng tính năng thử nghiệm của nó.)
+1

'[[: upper:]]' là một tùy chọn khác. – wnoise

+0

Ah, cảm ơn. Tôi có một số loại dị ứng với những cấu trúc đó và không bao giờ nghĩ về chúng. – chaos

+0

Vượt qua điều này trong khi tìm kiếm một cái gì đó khác biệt, và upvoting vì câu hỏi liên quan của bạn nứt tôi lên. :-) – KSwift87

Trả lời

15

Nó thực sự [A-Za-y], và nó đã làm với đối chiếu ngôn ngữ. Nếu bạn muốn ghi đè lên, hãy đặt $LC_COLLATE một cách thích hợp; hoặc là C hoặc POSIX nên làm.

+0

Ồ, cảm ơn bạn cảm ơn. '[A-Za-y]'? Tôi sợ hãi khi hỏi, nhưng tại sao 'y' và không phải' z'? – chaos

+0

Vì 'Z' trước' z' trong thứ tự đối chiếu. –

+3

Phải, trong các miền địa phương bị hỏng này [A-Z] 'biến thành' [AaBbCcDd .... YyZ] ' – wnoise

3

Tùy thuộc vào ngôn ngữ của bạn. Nếu bạn muốn rằng [A..Z] chỉ khớp với chữ cái viết hoa, bạn có thể sử dụng ngôn ngữ C: đặt LC_COLLATE hoặc LC_ALL đến C.

LC_ALL=C 
ls [A..Z]* 

bash manual, pattern matching

+1

Nhưng sau đó, nhược điểm IMO của điều này là khi bạn 'ls', bạn nhận được tất cả các tập tin chữ hoa đầu tiên và sau đó tất cả chữ thường ... và kết quả là, hầu hết thời gian, bạn phải nhìn vào hai nơi cho một tệp bạn không thể nhớ liệu tệp có bắt đầu bằng chữ hoa hay chữ thường hay không.;-) –

-1

vỏ Unix không thực sự sử dụng biểu thức thông thường, nhưng mẫu glob, đó là khác biệt rõ rệt từ regexes. Một khác biệt là chúng được neo hoàn toàn vào đầu và cuối của chuỗi - ví dụ: ls foo[a-z] sẽ liệt kê tệp food, nhưng không phải fooble. Nó không thực sự là ls làm khớp ở đây, nhưng chính vỏ đó. Bóng tối cũng là thường là đôi khi không phân biệt chữ hoa chữ thường (tùy thuộc vào việc triển khai).

Hãy xem manpage cho trình tương tác yêu thích của bạn và đọc về kết hợp toàn cục - ví dụ: bash's manpage about filename expansion mô tả cú pháp mà nó sử dụng.

+1

Bạn nói đúng rằng vỏ sử dụng các bóng tối chứ không phải là regexps, nhưng các biểu đồ có phân biệt chữ hoa chữ thường. – wnoise

+0

@wnoise: hmm, tôi nghĩ rằng phần đó phụ thuộc vào việc triển khai thực hiện; Tôi sẽ nghiên cứu thêm. – Ether

Các vấn đề liên quan