2012-05-14 33 views
5

yo conseguimos una cadena que se ve así:Bash - Los números de extracto de cadena

"abcderwer 123123 iopjjop 10.200 asdfasdf"

Ahora quiero extraer los números, después de la XX Sistema, xxx donde x es una número entre 0-9. P.ej. 10,200. Tiene que ser de cinco dígitos, y debe contener ",".

¿Cómo puedo hacer eso?

Gracias

Respuesta

9

Puede utilizar grep:

$ echo "abcderwer 123123 10,200 asdfasdf iopjjop" | egrep -o '[0-9]{2},[0-9]{3}' 
10,200 
+0

excelente respuesta, gracias – user1360250

1

Salida de coincidencia de patrones y expresiones regulares.

Enlaces:

Bash regular expressions

Patterns and pattern matching

SO question

y como se ha mencionado anteriormente, una manera de utilizar la coincidencia de patrones es con grep. Otros usos: el eco admite patrones (globbing) y encuentra admite expresiones regulares.

+1

'echo' does not y' find' no es aplicable a la pregunta. –

+0

@DennisWilliamson Nunca dije que lo fueran. Y puedes usar patrones con eco. Ejemplo: echo * ocu? Ent? devolvería "Documentos" si está en una carpeta de inicio normal. Me doy cuenta de que querías decir expresión regular, voy a editar eso :) – keyser

+0

Eso no es una expresión regular, eso es globbing. –

0

La coincidencia de patrones simples (patrones glob) está integrada en el armazón. Asumiendo que tiene las cuerdas en $* (es decir, son argumentos de línea de comandos a su script, o que han utilizado set en una cadena que haya obtenido de otra manera), intente esto:

for token; do 
    case $token in 
    [0-9][0-9],[0-9][0-9][0-9]) echo "$token" ;; 
    esac 
done 
+1

Eso sería '$ @'. Hay una diferencia –

+0

Cuando accede a la línea de comando, ciertamente hay una diferencia entre '$ *' y '$ @'; pero elegí específicamente llamar a la variable que contiene la matriz 'argv' por su nombre original de Bourne porque ese es el nombre que muchas exposiciones de nivel principiante usan; y en este contexto, cuando desee que los valores se dividan en tokens separados por espacios en blanco, eso es lo que usaría un script.Estoy de acuerdo en que si tiene que referirse directamente a los parámetros posicionales en un script, '" $ @ "' casi siempre es lo que quiere. – tripleee

+0

Con, por ejemplo, 'set - 'abc def' ghi',' para arg en "$ @"; hacer eco "$ arg"; hecho' hace lo correcto. Estos raramente hacen lo correcto: '$ *' o '" $ * "' (rara vez = solo cuando se quieren aplanar los argumentos). No tiene sentido continuar repitiendo exposiciones de nivel principiante que son incorrectas. –

0

El siguiente ejemplo la utilización de su cadena de datos de entrada debería resolver el problema usando sed.

$ echo abcderwer 123123 10,200 asdfasdf iopjjop | sed -ne 's/^.*\([0-9,]\{6\}\).*$/\1/p' 
10,200 
4

En pura Bash:

pattern='([[:digit:]]{2},[[:digit:]]{3})' 
[[ $string =~ $pattern ]] 
echo "${BASH_REMATCH[1]}" 
0

una solución ligeramente atípico:.

< input tr -cd [0-9,\ ] | tr \ '\012' | grep '^..,...$' 

(El primer pa elimina todo excepto comas, espacios y dígitos El segundo tr reemplaza espacios con líneas nuevas, poniendo cada "número" en una línea separada , y grep descarta todo excepto aquellos que coinciden con su criterio).

Cuestiones relacionadas