2011-12-14 12 views
54

grep nie działa przy użyciu opcji --ignore-case i --only-match. Przykład:grep --ignore-case --only

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

Ale

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

Według strony man:

-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. 

Czy to bug z grep lub nie dostać strony mapa?

Używam Mac OS X 10.6.8 i

$ grep --version 
grep (GNU grep) 2.5.1 

Znaleziony ten link: http://lists.gnu.org/archive/html/bug-gnu-utils/2003-11/msg00040.html

Oczywiście możliwe jest użycie obejścia jak grep -o [aA][bB][cC], ale to nie wydaje się być dobra opcja.

Odpowiedz

39

To knownbug na początkowym 2.5.1 i została ustalona na początku 2007 roku (Redhat 2.5.1-5) zgodnie z raportami o błędach. Niestety Apple nadal używa 2.5.1 nawet na Mac OS X 10.7.2.

Możesz uzyskać nowszą wersję za pośrednictwem Homebrew (3.0) lub MacPorts (2.26) lub fink (3.0-1).


Edycja: Najwyraźniej została ustalona na OSX 10.11 (a może wcześniej), mimo że wersja grep zgłaszane jest nadal 2.5.1.

+0

Kenny, dzięki! To, co mówisz, ma sens, postaram się zaktualizować. – schatten

5

To powinien być problem w Twojej wersji grep.

Twoje przypadki testowe są tutaj działa poprawnie na moim komputerze:

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

A moja wersja jest:

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

2.6.3 działa również. – FakeRainBrigand

+0

Działa dla mnie na 2.5.1 na Red Hat Enterprise Linux 5. –

+1

Wygląda na to, że mam zainstalowany Red Hat 2.5.1-55, więc jest po naprawieniu błędu, który raportuje @KennyTM. –

0

sugeruję, że -i oznacza to pasuje „abc”, ale różnica jest na wyjściu. -i nie manipuluje wejściem, więc nie zmieni "ABC" na "abc", ponieważ podałeś "abc" jako wzór. -o mówi, że pokazuje tylko część danych wyjściowych, która pasuje do określonego wzorca, nie mówi o pasujących danych wejściowych.

Wyjście echo "ABC" | grep -i abc jest ABC The -o pokazuje dopasowanie wyjścia "abc", więc nic nie pokazuje:

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

Jeśli twój grep -i nie działa, spróbuj użyć polecenia tr, aby przekonwertować wyjście pliku na małe litery, a następnie przeprowadź do standardowego pliku grep, czegokolwiek szukasz. (Brzmi to skomplikowanie, ale faktyczne polecenie, które ci podałem, nie jest!).

Zauważ, że polecenie tr nie zmienia zawartości oryginalnego pliku, po prostu konwertuje go przed pobraniem do grep.

1.here to w jaki sposób można to zrobić w pliku

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

2.or w Twoim przypadku, jeśli jesteś po prostu powtarzając coś

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

Nie zmienia zawartości, ale zmienia strumień przesyłany strumieniowo, więc nie otrzymasz oryginalnej dopasowanej zawartości pliku. – schatten