Estrarre la sottostringa in Bash

Dato un nome di file nella forma someletters_12345_moreleters.ext, voglio estrarre le 5 cifre e metterle in una variabile.

Quindi, per enfatizzare il punto, ho un nome di file con un numero x di caratteri, poi una sequenza di cinque cifre circondata da un singolo underscore su entrambi i lati e poi un'altra serie di un numero x di caratteri. Voglio prendere il numero di 5 cifre e metterlo in una variabile.

Sono molto interessato al numero di modi diversi in cui questo può essere realizzato.

Soluzione

Usa cut:

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

Più generico:

INPUT='someletters_12345_moreleters.ext'
SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)
echo $SUBSTRING
Commentari (7)

Soluzione generica in cui il numero può essere ovunque nel nome del file, utilizzando la prima di tali sequenze:

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

Un'altra soluzione per estrarre esattamente una parte di una variabile:

number=${filename:offset:length}

Se il vostro nome di file ha sempre il formato stuff_digits_... potete usare awk:

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

Ancora un'altra soluzione per rimuovere tutto tranne le cifre, usate

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

C'è anche il comando integrato bash 'expr':

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