2012-06-23 20 views
13

tôi không thể nhận grep để trường hợp nhạy cảm tìm kiếm với mô hình nàygrep case sensitive [A-Z]?

$ grep 'T[A-Z]' test.txt 
The Quick Brown Fox Jumps Over The Lazy Dog 
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 
+0

Điều này có vẻ là một lỗi trong ít nhất một số phiên bản 'grep'; khi bạn sử dụng một loạt các chữ cái trong regex của mình, tìm kiếm trong trường hợp không nhạy cảm với tất cả các chữ cái nhưng là chữ cái đầu tiên trong phạm vi. Ví dụ. 'echo 's' | grep '[S-T]' 'không tạo ra bất kỳ đầu ra nào, trong khi' echo 't' | grep '[S-T]' 'kết quả đầu ra' t'. Mặt khác, 'echo 't' | grep -o '[S-T]' 'không xuất ra bất cứ thứ gì, điều này hơi khó hiểu. Sử dụng '[[: upper:]]' thay vào đó dường như giải quyết vấn đề này cho trường hợp khi phạm vi là '[A-Z]'. – HelloGoodbye

Trả lời

7

Sử dụng dấu ngoặc kép để ngăn chặn các mô hình không bị xuất hiện như một glob để tệp (s) trong hệ thống tập tin của trình bao. ''

Sử dụng lớp nhân vật được đặt tên để đảm bảo khớp trùng chữ thường. [[:lower:]]

Sử dụng trình định lượng để tạo kết quả phù hợp cho nhiều hơn một ký tự. \+

Sử dụng (các) neo để đảm bảo khớp được định vị chính xác. ^

grep '^T[[:upper:]]\+' test.txt 

Lý do mà [A-Z] không làm việc cho bạn là cách miền địa phương bạn đang sử dụng được thực hiện trên hệ thống của bạn, mô hình đó cũng bao gồm chữ thường.

+1

@svnpenn: Xem [this] (http://unix.stackexchange.com/questions/15980/does-should-lc-collate-affect-character-ranges) và [this] (http: //unix.stackexchange. com/questions/19322/tại sao-là-capital-letters-bao gồm-in-a-range-of-lower-case-chữ-trong-một-awk-rege) cho một cuộc thảo luận về các vấn đề. –

5

Bạn có thể thiết lập giá trị LANG:

$ LANG=C grep 'T[A-Z]' test.txt 
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 
1
grep 'T[[:upper:]]' test.txt 
grep 'T[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' test.txt