2009-11-15 14 views
9

Dada la entrada¿Por qué falla este `grep -o` y cómo debo evitarlo?

echo abc123def | grep -o '[0-9]*' 

en un ordenador (con GNU grep 2.5.4), esto devuelve 123, y en otra (con GNU grep 2.5.1) devuelve la cadena vacía. ¿Hay alguna explicación para por qué grep 2.5.1 falla aquí, o es solo un error? Estoy usando grep -o de esta manera en un script bash que me gustaría poder ejecutar en diferentes computadoras (que pueden tener diferentes versiones de grep). ¿Hay una "forma correcta" de obtener un comportamiento consistente?

+1

¿Por qué querrías grep en una expresión regular que puede coincidir con cero caracteres, de todos modos? Esperaría que coincidiera con cada línea, no solo líneas con dígitos en ellas. –

Respuesta

9

Sí, el manejo de 2.5.1 -o fue con errores: http://www.mail-archive.com/[email protected]/msg00993.html

Grep probablemente no es la herramienta adecuada para esto; sed o tr o incluso perl podría ser mejor dependiendo de cuál es la tarea real.

+0

+1: Pero si hay una variación entre las versiones menores de 'grep' de GNU (aunque debido a errores) no hay muchas posibilidades de encontrar consistencia entre diferentes computadoras. Sin embargo, hay muchas otras herramientas. – pavium

+1

Recomendar el uso de otra herramienta, sin una solución correcta no es una buena respuesta. Como evidencia, en la mayoría de los casos se puede resolver con el uso de pure bash. No incluiste una solución exacta para mí. – kisp

0

Esto le dará resultados similares:

echo abc123def | sed -n 's/[^0-9]*\([0-9]\+\).*/\1/p' 

Su pregunta es casi un duplicado del this one.

2

puede usar el caparazón. su rápido

$ str=abc123def 
$ echo ${str//[a-z]/} 
123 
2

que tenía el mismo problema y encontró que egrep se instaló en esa máquina. Una solución rápida utilizaba

echo abc123def | egrep -o '[0-9]*' 
-1

Puesto que está utilizando una expresión regular por lo que debe utilizar:

  1. grep -E
  2. egrep (como Sebastián publicada).

¡Buena suerte!

+2

-E/egrep es requerido para expresiones regulares * extendidas; '[0-9] *' es una expresión regular regular válida. (El 're' en 'grep' significa expresión regular). Quizás el error en 2.5.1 no estuvo presente en el soporte extendido de expresiones regulares, pero el mero hecho de que se use una expresión regular no significa que necesites -E. – chepner

Cuestiones relacionadas