2011-12-14 23 views
54

grep không thành công khi sử dụng cả hai tùy chọn --ignore-case và --only-match. Ví dụ:grep --ignore-case --only

$ echo "abc" | grep -io abc 
abc 
$ echo "ABC" | grep -io abc 
$ 

Nhưng

$ echo "abc" | grep -i abc 
abc 
$ echo "ABC" | grep -i abc 
ABC 

Theo trang người đàn ông:

-o, --only-matching 
      Show only the part of a matching line that matches PATTERN. 
    -i, --ignore-case 
      Ignore case distinctions in both the PATTERN and the input files. 

Có một lỗi của grep hoặc tôi đã không nhận được trang bản đồ?

Tôi đang sử dụng Mac OS X 10.6.8 và

$ grep --version 
grep (GNU grep) 2.5.1 

Tìm thấy liên kết này: http://lists.gnu.org/archive/html/bug-gnu-utils/2003-11/msg00040.html

Dĩ nhiên chúng ta có thể sử dụng workaround như grep -o [aA][bB][cC], nhưng điều này dường như không phải là một lựa chọn tốt.

Trả lời

39

Đây là một knownbug trên ban đầu 2.5.1, và đã được cố định vào đầu năm 2007 (Redhat 2.5.1-5) theo báo cáo lỗi. Thật không may Apple vẫn đang sử dụng 2.5.1 ngay cả trên Mac OS X 10.7.2.

Bạn có thể nhận phiên bản mới hơn qua Homebrew (3.0) hoặc MacPorts (2.26) hoặc fink (3.0-1).


Chỉnh sửa: Dường như đã được sửa trên OS X 10.11 (hoặc có thể sớm hơn), mặc dù phiên bản grep được báo cáo vẫn là 2.5.1.

+0

Kenny, cảm ơn! Những gì bạn đang nói không có ý nghĩa, sẽ cố gắng cập nhật. – schatten

5

Nó sẽ là một vấn đề trong phiên bản grep của bạn.

trường hợp thử nghiệm của bạn đang làm việc một cách chính xác ở đây trên máy tính của tôi:

$ echo "abc" | grep -io abc 
abc 
$ echo "ABC" | grep -io abc 
ABC 

Và phiên bản của tôi là:

$ grep --version 
grep (GNU grep) 2.10 
+0

2.6.3 tác phẩm cũng có. – FakeRainBrigand

+0

Hoạt động với tôi trên 2.5.1 trên Red Hat Enterprise Linux 5. –

+1

Có vẻ như tôi đã cài đặt Red Hat 2.5.1-55, vì vậy sau khi sửa lỗi mà @KennyTM báo cáo. –

0

tôi muốn đề nghị rằng -i có nghĩa là nó không phù hợp với "ABC", nhưng sự khác biệt là ở đầu ra. -i không thao tác đầu vào, vì vậy nó sẽ không thay đổi "ABC" thành "abc" vì bạn đã chỉ định "abc" làm mẫu. -o cho biết nó chỉ hiển thị phần đầu ra khớp với mẫu được chỉ định, nó không nói về đầu vào khớp.

Kết quả của echo "ABC" | grep -i abcABC, các -o cho thấy khớp đầu ra "abc" nên không có gì cho thấy:

Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o abc 
Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o ABC 
ABC 
2

Nếu grep -i của bạn không hoạt động thì hãy thử sử dụng lệnh tr để chuyển đổi đầu ra của tệp của bạn thành chữ thường và sau đó đặt nó vào grep chuẩn với bất kỳ thứ gì bạn đang tìm kiếm. (Nghe có vẻ phức tạp nhưng lệnh thực tế mà tôi đã cung cấp cho bạn thì không!).

Chú ý lệnh tr không thay đổi nội dung của tệp ban đầu của bạn, nó chỉ chuyển đổi nó ngay trước khi nó nạp nó vào grep.

1.here là cách bạn có thể làm điều này trên một tập tin

tr '[:upper:]' '[:lower:]' <your_file.txt|grep what_ever_you_are_searching_in_lower_case 

2.or trong trường hợp của bạn nếu bạn chỉ là lặp lại một cái gì đó

echo "ABC"|tr '[:upper:]' '[:lower:]' | grep abc 
+0

Nó không thay đổi nội dung, nhưng nó thay đổi luồng đường ống, vì vậy bạn sẽ không nhận được nội dung phù hợp gốc của tệp. – schatten