it-swarm.com.de

grep --ignore-case --nur

grep schlägt fehl, wenn die Optionen --ignore-case und --only-match ..__ verwendet werden. Beispiel:

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

Aber

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

Laut Manpage:

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

Ist es ein Fehler oder ich habe die Kartenseite nicht bekommen?

Ich verwende Mac OS X 10.6.8 und 

$ grep --version
grep (GNU grep) 2.5.1

Gefunden diesen Link: http://lists.gnu.org/archive/html/bug-gnu-utils/2003-11/msg00040.html

Natürlich ist es möglich, eine Problemumgehung wie grep -o [aA][bB][cC] zu verwenden, aber dies scheint keine gute Option zu sein.

65
schatten

Dies ist ein bekannterFehler in der ursprünglichen Version 2.5.1 und wurde Anfang 2007 (Redhat 2.5.1-5) gemäß den Fehlerberichten behoben. Leider verwendet Apple 2.5.1 auch unter Mac OS X 10.7.2 .

Sie können eine neuere Version über Homebrew (3.0) oder MacPorts (2.26) oder Fink (3.0-1) erhalten.


Edit: Anscheinend wurde es unter OS X 10.11 (oder früher) behoben, obwohl die gemeldete grep-Version immer noch 2.5.1 ist.

44
kennytm

Es sollte ein Problem in Ihrer Version von grep sein.

Ihre Testfälle funktionieren hier auf meinem Rechner korrekt:

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

Und meine Version ist:

$ grep --version
grep (GNU grep) 2.10
9
Felix Yan

Wenn Ihr grep -i nicht funktioniert, verwenden Sie den Befehl tr, um die Ausgabe Ihrer Datei in Kleinbuchstaben umzuwandeln, und leiten Sie sie dann in das Standard-grep mit dem gewünschten Ergebnis. (es hört sich kompliziert an, aber der eigentliche Befehl, den ich Ihnen gegeben habe, ist es nicht!).

Beachten Sie, dass der Befehl tr den Inhalt der Originaldatei nicht ändert. Er wird nur konvertiert, bevor er in grep eingespeist wird. 

1. wie können Sie dies für eine Datei tun? 

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

2.oder in Ihrem Fall, wenn Sie nur etwas wiederholen

echo "ABC"|tr '[:upper:]' '[:lower:]' | grep abc
2
grepit

Ich würde vorschlagen, dass der -i bedeutet, dass er mit "ABC" übereinstimmt, der Unterschied liegt jedoch in der Ausgabe. -i manipuliert die Eingabe nicht, daher ändert sich "ABC" nicht in "abc", da Sie als Muster "abc" angegeben haben. -o sagt, es zeigt nur den Teil der Ausgabe an, der mit dem angegebenen Muster übereinstimmt, sagt jedoch nichts über übereinstimmende Eingaben aus. 

Die Ausgabe von echo "ABC" | grep -i abc ist ABC, der -o zeigt eine Ausgabe, die mit "abc" übereinstimmt, sodass nichts angezeigt wird:

Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o abc
Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o ABC
ABC
0
Matt Lacey