2014-04-07 15 views
32

Mục tiêu của tôi là khớp các địa chỉ email thuộc về Yahoo! họ tên miền. Trong các hệ thống * nix (tôi sẽ sử dụng Ubuntu), những lợi ích và hạn chế đối với bất kỳ phương pháp nào trong số những phương pháp này để phù hợp với mô hình?Cách sử dụng grep không phân biệt chữ hoa chữ thường hiệu quả nhất là gì?

Và nếu có giải pháp khác, thanh lịch hơn mà tôi chưa có khả năng tưởng tượng, hãy chia sẻ.

Dưới đây là:

  • Sử dụng grep với tùy chọn -i:

grep -Ei "@(yahoo|(y|rocket)mail|geocities)\.com"

  • Dịch ký tự cho tất cả các trường hợp trên hoặc chữ thường sau đó grep:

tr [:upper:] [:lower:] < /path/to/file.txt | grep -E "@(yahoo|(y|rocket)mail|geocities)\.com"

  • Bao gồm một bộ ký tự cho mỗi nhân vật trong các mô hình (dưới đây sẽ đương nhiên không phù hợp với một cái gì đó giống như "@ rOcketmail.com", nhưng bạn sẽ có được ý tưởng về những gì nó sẽ trở thành nếu tôi kiểm tra từng ký tự cho trường hợp):

grep -E "@([yY]ahoo|([yY]|[rR]ocket)[mM]ail|[gG]eo[cC]ities)\.[cC][oO][mM]" /path/to/file.txt

+5

Điều này sẽ không khó để kiểm tra. Bạn đã thử chưa? –

+1

Bạn đã thử điểm chuẩn chưa? Tôi nghi ngờ rằng mẫu đầu tiên của bạn sẽ nhanh nhất. Tôi hy vọng rằng vấn đề này có nhiều khả năng được điều chỉnh bởi tập tin I/O hơn tốc độ xử lý ... vì nó tuyến tính ở kích thước của đầu vào. Hãy coi chừng [tối ưu hóa vi mô] (http://blog.codinghorror.com/the-sad-tragedy-of-micro-optimization-theater/). – Floris

+0

Một điều bạn có thể muốn ghi nhớ là các nhóm chụp có thể tốn kém. Nếu bạn không cần trả về các giá trị được nhóm, hãy xem xét sử dụng '(? :)' để thay thế. – CAustin

Trả lời

34

grep -i hóa ra là chậm hơn so với dịch để Giảm trước grepping đáng kể, vì vậy tôi đã kết thúc bằng một biến thể của # 2.

Cảm ơn @ mike-w đã nhắc tôi rằng một thử nghiệm đơn giản sẽ diễn ra một chặng đường dài.

+4

Và cảm ơn bạn đã chia sẻ kết quả thử nghiệm của bạn với tất cả chúng tôi! – Dan

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