Ejemplo:

file="123 hello"

¿Cómo puedo editar la cadena file tal que sólo contiene los números y el texto de la parte eliminada?

Así,

echo $file

debe imprimir 123 sólo.

InformationsquelleAutor Ayush Mishra | 2013-11-01

2 Comentarios

  1. 75

    Esta es una manera con sed:

    $ echo $file | sed 's/[^0-9]*//g' 
    123
    $ echo "123 he23llo" | sed 's/[^0-9]*//g'
    12323

    O con puro bash:

    $ echo "${file//[!0-9]/}" 
    123
    $ file="123 hello 12345 aaa"
    $ echo "${file//[!0-9]/}" 
    12312345

    Guardar el resultado en la variable en sí, hacer

    $ file=$(echo $file | sed 's/[^0-9]*//g')
    $ echo $file
    123
    
    $ file=${file//[!0-9]/}
    $ echo $file
    123
    • En el interés de la integridad, también puede guardar el resultado en la misma variable con el puro bash forma: file=${file//[!0-9]/}. También, usted puede, en general, reemplazar echo algo | el comando con el comando <<< algo.
    • Buen punto, @MarkReed. Según el tipo de usuario pidiendo que he preferido dejar la respuesta muy ingenuo, como <<< puede ser extraño para la gente que comienza a bash-script. Puedo actualizar mi respuesta con la file=$file{file//[!0-9]/}, muchas gracias!
    • En busca de hacer esto por una cadena de versión (por ejemplo,git version 1.7.1)? Uso ${gitVersion//[!0-9.]/} y mantiene los períodos.
    • Por curiosidad, ¿por qué este comando no eliminar los espacios en blanco en la cadena? Este es en realidad el comportamiento que yo quería, pero no entiendo por qué es el valor predeterminado.
    • seguro que no lo has probado, pero he probado y funciona: file="hola que tal 23" y, a continuación, echo "${file//[!0-9]/}" devuelve 23.
    • Lo siento, debería haber sido más específico (y me equivoqué). echo hello 1 2 3 | sed 's/[^0-9]*//' (no en el ejemplo) devuelve 1 2 3, pero tu ejemplo, echo hello 1 2 3 | sed 's/[^0-9]*//g', devuelve 123. Preguntándose por qué dejar fuera la g conserva espacios.
    • es sinónimo de «sustitución global». Cuando se utiliza, cualquier reemplazo se realiza tantas veces como sea posible dentro de la línea. De lo contrario, tal como acabamos de ver, esto sólo sucede una vez. Comparar sed 's/./X/' <<< "hello" con sed 's/./X/g' <<< "hello" (spoiler: vuelven «Xello» y «XXXXX»).

  2. 6

    Puede decir:

    echo ${file%%[^0-9]*}

    Sin embargo, este se topa con problemas en ciertos casos:

    $ file="123 file 456"
    $ echo ${file%%[^0-9]*}
    123

    Utilizando tr:

    $ file="123 hello 456"
    $ new=$(tr -dc '0-9' <<< $file)
    $ echo $new
    123456
    • Se parece a algo es terriblemente de malo con esta respuesta!
    • «ciertos casos»? ${file%%[^0-9]*} siempre va a quitar todo, desde el primer no-dígito al final de la cadena. %% no es lo que usted quiere aquí en absoluto (ni es % o # o ##). Me siento como que me falta una broma aquí.
    • Queridos @MarkReed, pensé que lo que estás diciendo se hizo evidente en la respuesta sí o no? Probablemente esa fue la razón de que el otro enfoque se sugirió. Me estoy perdiendo algo aquí?
    • Por otra parte, siéntase libre de añadir tu respuesta. Estaré encantado de eliminar este.
    • Estoy solo sin entender que el objetivo de traer una obviamente incorrecta solución antes de darse la vuelta y ofreciendo un correcto y, a continuación, comentando su propia respuesta la afirmación de que hay algo terriblemente mal con él. Tal vez es una técnica pedagógica en lugar de una broma, pero de cualquier manera me temo que fue por encima de mi cabeza completamente.
    • Me gustaría poder downvote comentarios. No hay lugar para los ataques personales aquí.
    • Doy +1 a esta respuesta. La primera solución puede ser útil en algunos casos simples, como el ejemplo que fue proporcionado por el OP. Así que, no veo ningún problema para proponer esta solución, aunque me hubiera tendencia a utilizar siempre sed. Por otra parte, devnull ha advertido acerca de las limitaciones de esta primera solución y se la dio a otro que funciona bien. Más soluciones, más riqueza.

Dejar respuesta

Please enter your comment!
Please enter your name here