Teilstring in Bash extrahieren

Bei einem Dateinamen in der Form someletters_12345_moreleters.ext möchte ich die 5 Ziffern extrahieren und in eine Variable einfügen.

Zur Verdeutlichung: Ich habe einen Dateinamen mit x Zeichen, dann eine fünfstellige Sequenz, die auf beiden Seiten von einem Unterstrich umgeben ist, und dann eine weitere Reihe von x Zeichen. Ich möchte die 5-stellige Zahl nehmen und in eine Variable einfügen.

Ich bin sehr daran interessiert, wie viele verschiedene Möglichkeiten es gibt, dies zu bewerkstelligen.

Lösung

Verwenden Sie cut:

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

Mehr generisch:

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

Allgemeine Lösung, bei der die Nummer an beliebiger Stelle im Dateinamen stehen kann, unter Verwendung der ersten dieser Sequenzen:

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

Eine andere Lösung, um genau einen Teil einer Variablen zu extrahieren:

number=${filename:offset:length}

Wenn Ihre Dateinamen immer das Format stuff_digits_... haben, können Sie awk verwenden:

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

Eine weitere Lösung, um alles außer Ziffern zu entfernen, ist die Verwendung von

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

Es gibt auch den in der Bash eingebauten Befehl 'expr':

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