grep échoue lors de l’utilisation des options --ignore-case et --only-match . Exemple:
$ echo "abc" | grep -io abc
abc
$ echo "ABC" | grep -io abc
$
Mais
$ echo "abc" | grep -i abc
abc
$ echo "ABC" | grep -i abc
ABC
Selon la page de manuel:
-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.
Est-ce un bug de grep ou je n'ai pas eu la page de carte?
J'utilise Mac OS X 10.6.8 et
$ grep --version
grep (GNU grep) 2.5.1
Trouvé ce lien: http://lists.gnu.org/archive/html/bug-gnu-utils/2003-11/msg00040.html
Bien sûr, il est possible d’utiliser une solution de contournement comme grep -o [aA][bB][cC]
, mais cela ne semble pas être une bonne option.
Ceci est un connubug sur la version initiale 2.5.1, et a été corrigé début 2007 (Redhat 2.5.1-5) conformément aux rapports de bogues. Malheureusement, Apple utilise toujours la version 2.5.1 même sur Mac OS X 10.7.2 .
Vous pouvez obtenir une version plus récente via Homebrew (3.0) ou MacPorts (2.26) ou fink (3.0-1) .
Éditer: Apparemment, cela a été corrigé sous OS X 10.11 (ou peut-être plus tôt), même si la version de grep rapportée est toujours la version 2.5.1.
Cela devrait être un problème dans votre version de grep.
Vos cas de test fonctionnent correctement ici sur ma machine:
$ echo "abc" | grep -io abc
abc
$ echo "ABC" | grep -io abc
ABC
Et ma version est:
$ grep --version
grep (GNU grep) 2.10
Si votre grep -i ne fonctionne pas, essayez d'utiliser la commande tr pour convertir la sortie de votre fichier en minuscule, puis transmettez-la au grep standard avec ce que vous cherchez. (Cela semble compliqué, mais la commande que je vous ai fournie ne l’est pas!).
Notez que la commande tr ne modifie pas le contenu de votre fichier d'origine, elle le convertit juste avant de l'envoyer dans grep.
1. voici comment vous pouvez le faire sur un fichier
tr '[:upper:]' '[:lower:]' <your_file.txt|grep what_ever_you_are_searching_in_lower_case
2.ou dans votre cas si vous faites écho à quelque chose
echo "ABC"|tr '[:upper:]' '[:lower:]' | grep abc
Je suggérerais que le -i
signifie qu'il correspond à "ABC", mais la différence est dans la sortie. -i
ne manipule pas l'entrée, donc il ne changera pas "ABC" en "abc" car vous avez spécifié "abc" comme motif. -o
dit qu'il montre seulement la partie de la sortie qui correspond au modèle spécifié, il ne dit pas à propos de l'entrée correspondante.
Le résultat de echo "ABC" | grep -i abc
est ABC
, le -o
affiche le résultat correspondant à "abc", ainsi rien ne s'affiche:
Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o abc
Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o ABC
ABC