545 votos

Extracto de la subcadena en bash

Buscando una solución en bash (será parte de una secuencia de comandos).

Dado un nombre de archivo en la forma "someletters_12345_moreleters.ext", quiero extraer los 5 dígitos y los puso en una variable.

Para enfatizar el punto. Tengo un nombre de archivo con x número de caracteres luego de cinco dígitos de la secuencia rodeado por una sola subrayado en cualquiera de los lados, a continuación, otro conjunto de x número de caracteres. Quiero tomar el número de 5 dígitos y colocarla en una variable.

Estoy muy interesado en el número de diferentes maneras en que esto puede lograrse. Como con la mayoría de las cosas, estoy seguro de que hay un número de maneras diferentes para hacer frente a este problema.

Gracias por su ayuda en la avanzada.


Duplicado de

831voto

JB. Puntos 12482

Si x es constante, la siguiente expansión de parámetros se realiza extracción de subcadena:

b=${a:12:5}

Si los caracteres de subrayado en torno a los dígitos son los únicos en la entrada, puede quitar el prefijo y sufijo en dos pasos:

tmp=${a#*_}
b=${tmp%_*}

Si hay otros subraya, es probablemente factible de todos modos, aunque más complicado. Si alguien sabe cómo realizar ambas expansiones en una sola expresión, me gustaría saber demasiado.

Ambas soluciones se presentan son pura bash, con la ausencia de un proceso de desove de los involucrados, por lo tanto muy rápido.

544voto

FerranB Puntos 9532

Usar cortar:

echo someletters_12345_moreleters.ext | cut -d'_' -f 2

Más genérico:

INPUT=someletters_12345_moreleters.ext
SUBSTRING=`echo $INPUT| cut -d'_' -f 2`
echo $SUBSTRING

79voto

Solución genérica donde el número puede ser en cualquier lugar en el nombre del archivo, utilizando el primero de tales secuencias:

number=$(echo $filename | egrep -o '[[:digit:]]{5}' | head -n1)

Otra solución para extraer exactamente una parte de una variable:

number=${filename:offset:length}

Si el nombre del archivo siempre tiene el formato stuff_digits_... puede utilizar awk:

number=$(echo $filename | awk -F _ '{ print $2 }')

Todavía otra solución para quitar todo menos dígitos, uso

number=$(echo $filename | tr -cd '[[:digit:]]')

66voto

brown.2179 Puntos 324

trata de usarcut -c startIndx-stopIndx

17voto

PEZ Puntos 9662

Edificio en respuesta de jor (que no funciona para mí):

substring=$(expr "$filename" : '.*_\([^_]*\)_.*')

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X