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