2012-03-03 24 views

Respuesta

5

que tiene que hacer la agrupación: \(...\) seguido por el número exacto de ocurrencia: \{<n>\} para hacer el trabajo:

maci:~ san$ echo 12345 | grep -o '\([[:digit:]]\)\{4\}' 
1234 

espero que ayude. ¡¡Aclamaciones!!

7

¿Quieres grep para detener a juego o lo hace sólo se preocupan por el primer partido. Usted podría utilizar si el head tarde es cierto ...

`grep stuff | head -n 1` 

Grep es una línea basada util así que la bandera -m 1 dice a grep para detenerse después de que coincide con la primera línea de que cuando se combina con la cabeza es bastante bueno en práctica.

+0

¡Esto funciona! Pero, ¿cómo realmente puedo detener grep de coincidencia después de la primera coincidencia si se encuentra? Sólo curioso. – abc

+0

-m no detiene la coincidencia de grep después de que se encuentre la 1ra coincidencia. – abc

+0

Al principio edité mi respuesta para incluir el indicador -m que es lo que ya tenía en su pregunta, ug. El uso de -m 1 limitará la búsqueda a solo la primera línea encontrada y la cabeza filtrará, lo que debería ser bastante bueno en la práctica. –

2

Uso sed en lugar de grep:

echo 12345 | sed -n '/^\([0-9]\{1,4\}\).*/s//\1/p' 

Esto coincide con un máximo de 4 dígitos al principio de la línea, seguido por nada, sólo mantiene los dígitos, y los imprime. El -n impide que las líneas se impriman de otra manera. Si la cadena de dígitos también puede aparecer en la línea media, entonces necesita un comando un poco más complejo.

De hecho, idealmente utilizará un sed con expresiones regulares PCRE, ya que realmente necesita un partido no codicioso. Sin embargo, hasta una aproximación razonable, puede utilizar: (! Un semi-solución a un problema mucho más complejo ... ahora retirado)

Desde desea que la primera cadena de hasta 4 dígitos en el línea, simplemente utilice sed para eliminar cualquier no-dígitos y luego imprimir la cadena de dígitos:

echo abc12345 | sed -n '/^[^0-9]*\([0-9]\{1,4\}\).*/s//\1/p' 

Esto coincide con una cadena de no-dígitos seguido de 1-4 dígitos seguidos de nada, sólo mantiene los dígitos, y las impresiones ellos.

+0

'sed 's/^ [^ 0-9] * \ ([0-9] \ {1,4 \} \). */\ 1/p; d'' tal vez un poco menos ocupado? – potong

0

Si - como en el ejemplo - su expresión numérica aparecerá al principio de la cadena que está empezando, usted podría añadir un anclaje de inicio de línea ^:

echo 12345 | grep -o '^\([[:digit:]]\)\{1,4\}' 

Dependiendo de los dígitos exactos que desee, un ancla de final de línea $ también podría ayudar.

Cuestiones relacionadas