Extraer la subcadena en Bash

Dado un nombre de archivo de la forma algunas letras_12345_moreleters.ext, quiero extraer los 5 dígitos y ponerlos en una variable.

Así que para enfatizar el punto, tengo un nombre de archivo con x número de caracteres y luego una secuencia de cinco dígitos rodeados por un solo guión bajo a cada lado y luego otro conjunto de x número de caracteres. Quiero tomar el número de 5 dígitos y ponerlo en una variable.

Estoy muy interesado en el número de maneras diferentes que esto se puede lograr.

Solución

Usa 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
Comentarios (7)

Solución genérica en la que el número puede estar en cualquier parte del nombre del archivo, utilizando la primera de dichas 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 su nombre de archivo siempre tiene el formato stuff_digits_... puede utilizar awk:

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

Otra solución para eliminar todo excepto los dígitos, es utilizar

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

También existe el comando incorporado de bash 'expr':

INPUT="someletters_12345_moreleters.ext"  
SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `  
echo $SUBSTRING
Comentarios (2)