Extraire une sous-chaîne en Bash

Étant donné un nom de fichier de la forme someletters_12345_moreleters.ext, je veux extraire les 5 chiffres et les mettre dans une variable.

Donc, pour souligner le point, j'ai un nom de fichier avec un nombre x de caractères, puis une séquence de cinq chiffres entourée d'un seul trait de soulignement de chaque côté, puis un autre ensemble de x caractères. Je veux prendre le nombre à 5 chiffres et le mettre dans une variable.

Je suis très intéressé par le nombre de façons différentes dont cela peut être accompli.

Solution

Utilisez [cut][1] :

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

Plus générique :

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

[1] : http://www.manpagez.com/man/1/cut/

Commentaires (7)

Solution générique où le numéro peut se trouver n'importe où dans le nom du fichier, en utilisant la première de ces séquences :

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

Une autre solution pour extraire exactement une partie d'une variable :

number=${filename:offset:length}

Si vos noms de fichiers ont toujours le format stuff_digits_... vous pouvez utiliser awk :

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

Encore une autre solution pour enlever tout sauf les chiffres, utilisez

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

Il existe également la commande bash intégrée 'expr' :

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