2011-12-14 10 views
54

grep falla al usar las opciones --ignore-case y --only-match. Ejemplo:grep --ignore-case --only

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

Pero

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

De acuerdo a la página hombre:

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

¿Es un error de grep o no tuve la página del mapa?

Estoy utilizando Mac OS X 10.6.8 y

$ grep --version 
grep (GNU grep) 2.5.1 

Encontramos este enlace: http://lists.gnu.org/archive/html/bug-gnu-utils/2003-11/msg00040.html

Por supuesto, es posible utilizar como solución grep -o [aA][bB][cC], pero esto no parece ser una buena opción.

Respuesta

39

Esta es una knownbug en la inicial 2.5.1, y se ha fijado a principios de 2007 (Redhat 2.5.1-5) según los informes de errores. Desafortunadamente, Apple todavía usa 2.5.1 incluso en Mac OS X 10.7.2.

Puede obtener una versión más nueva a través de Homebrew (3.0) o MacPorts (2.26) o fink (3.0-1).


Editar: Al parecer se ha fijado en OS X 10,11 (o tal vez antes), a pesar de que la versión de grep reportado sigue siendo 2.5.1.

+0

Kenny, gracias! Lo que dices tiene sentido, intentará actualizarse. – schatten

5

Debería haber un problema en su versión de grep.

Sus casos de prueba están funcionando correctamente aquí en mi máquina:

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

Y mi versión es:

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

2.6.3 trabajos también. – FakeRainBrigand

+0

Funciona para mí en 2.5.1 en Red Hat Enterprise Linux 5. –

+1

Parece que tengo instalado Red Hat 2.5.1-55, entonces es después de la corrección de errores que informa @KennyTM. –

0

me gustaría sugerir que el -i significa que hace juego "ABC", pero la diferencia está en la salida. -i no manipula la entrada, por lo que no cambiará "ABC" a "abc" porque especificó "abc" como el patrón. -o dice que solo muestra la parte del resultado que coincide con el patrón especificado, no dice acerca de la entrada coincidente.

La salida de echo "ABC" | grep -i abc es ABC, la -o muestra de adaptación de salida "abc" para que nada muestra:

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

Si su grep -i no funciona, intente usar el comando tr para convertir la salida de su archivo a minúsculas y luego canalizarlo a grep estándar con lo que esté buscando. (suena complicado, pero el comando real que he proporcionado para ti no lo es).

Observe que el comando tr no cambia el contenido de su archivo original, simplemente lo convierte justo antes de alimentarlo en grep.

1.here es cómo se puede hacer esto en un archivo

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

2.O en su caso si usted está haciendo eco de algo

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

No cambia el contenido, pero cambia la transmisión por canalización, por lo que no obtendrá un contenido coincidente original del archivo. – schatten