981 votes

copier la sous-chaîne dans une autre chaîne

La recherche d'une solution en bash (fera partie d'un script).

Donné un nom de fichier dans le formulaire "someletters_12345_moreleters.ext", je veux extraire les 5 chiffres et de les mettre dans une variable.

Afin de souligner le point. J'ai un nom de fichier avec un nombre x de caractères, puis un à cinq chiffres de la séquence entouré par un seul trait de soulignement de chaque côté puis de l'autre ensemble de x nombre de caractères. Je veux prendre le numéro à 5 chiffres et les mettre dans une variable.

Je suis très intéressé par le nombre de façons différentes que cela peut être accompli. Comme avec la plupart des choses, je suis sûr qu'il ya un certain nombre de façons différentes de s'attaquer à ce problème.

Merci pour votre aide à l'avance.


Double de

1431voto

JB. Points 12482

Si x est constante, le paramètre suivant expansion effectue sous-chaîne d'extraction:

b=${a:12:5}

Si le souligne autour de, les chiffres sont les seuls dans l'entrée, vous pouvez enlever le préfixe et le suffixe off en deux étapes:

tmp=${a#*_}
b=${tmp%_*}

Si il y a d'autres traits de soulignement, il est probablement possible de toute façon, bien que plus délicate. Si quelqu'un sait comment effectuer des agrandissements dans une seule expression, je voudrais savoir trop.

Les deux solutions présentées sont un pur bash, avec aucun processus de frai impliqués, donc très rapide.

885voto

FerranB Points 9532

Utiliser le couper:

Plus générique :

122voto

brown.2179 Points 324

essayez d'utiliser des cut -c startIndx-stopIndx

117voto

Solution générique où le nombre peut être n'importe où dans le nom de fichier, à l'aide de 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 votre nom de fichier de toujours avoir le format stuff_digits_... vous pouvez utiliser awk:

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

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

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

21voto

PEZ Points 9662

Bâtiment sur le jor de la réponse (qui ne fonctionne pas pour moi):

substring=$(expr "$filename" : '.*_\([^_]*\)_.*')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X