web-dev-qa-db-fra.com

grep --ignore-case --only

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.

65
schatten

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.

44
kennytm

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
9
Felix Yan

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
2
grepit

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
0
Matt Lacey