Uittreksel substring in Bash

Gegeven een bestandsnaam in de vorm someletters_12345_moreleters.ext, wil ik de 5 cijfers extraheren en in een variabele stoppen.

Dus om het punt te benadrukken, ik heb een bestandsnaam met x aantal karakters, dan een reeks van vijf cijfers omgeven door een enkele underscore aan elke kant en dan nog een reeks van x aantal karakters. Ik wil het 5 cijferige nummer nemen en dat in een variabele stoppen.

Ik ben zeer geïnteresseerd in het aantal verschillende manieren waarop dit kan worden bereikt.

Oplossing

Gebruik cut:

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

Meer algemeen:

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

Generieke oplossing waarbij het nummer overal in de bestandsnaam kan staan, met gebruik van de eerste van zulke reeksen:

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

Een andere oplossing om precies een deel van een variabele te extraheren:

number=${filename:offset:length}

Als je bestandsnaam altijd het formaat stuff_digits_... heeft, kun je awk gebruiken:

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

Nog een andere oplossing om alles te verwijderen behalve de cijfers, gebruik

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

Er is ook het bash builtin 'expr' commando:

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