web-dev-qa-db-fra.com

Quelle commande linux Shell renvoie une partie d'une chaîne?

Je veux trouver une commande linux qui peut renvoyer une partie de la chaîne. Dans la plupart des langages de programmation, il s'agit de la fonction substr(). Bash a-t-il une commande pouvant être utilisée à cette fin? Je veux pouvoir faire quelque chose comme ça ... substr "abcdefg" 2 3 - affiche cde.


Question similaire ultérieure:

88
Binny V A

Si vous recherchez un utilitaire Shell pour faire quelque chose comme ça, vous pouvez utiliser la commande cut.

Pour prendre votre exemple, essayez:

echo "abcdefg" | cut -c3-5

qui donne

cde

-cN-M indique à la commande cut de renvoyer les colonnes N à M, inclus.

161
Toybuilder

De la page de manuel bash:

${parameter:offset}
${parameter:offset:length}
        Substring  Expansion.   Expands  to  up  to length characters of
        parameter starting at the character  specified  by  offset.
[...]

Ou, si vous n'êtes pas sûr d'avoir bash, envisagez d'utiliser cut.

94
dmckee

En "pure" bash, vous disposez de nombreux outils pour la manipulation de (sous) chaînes, principalement, mais pas exclusivement, dans développement de paramètres :

${parameter//substring/replacement}
${parameter##remove_matching_prefix}
${parameter%%remove_matching_suffix}

Développement de la sous-chaîne indexée (comportements spéciaux avec décalages négatifs et, dans les nouveaux bashs, longueurs négatives):

${parameter:offset}
${parameter:offset:length}
${parameter:offset:length}

Et bien sûr, les extensions très utiles qui déterminent si le paramètre est null:

${parameter:+use this if param is NOT null}
${parameter:-use this if param is null}
${parameter:=use this and assign to param if param is null}
${parameter:?show this error if param is null}

Ils ont plus de comportements modifiables que ceux énumérés, et comme je l'ai dit, il existe d'autres moyens de manipuler des chaînes de caractères (un moyen courant étant $(command substitution) associé à sed ou à tout autre filtre externe). Mais ils sont si faciles à trouver en tapant man bash Que je ne pense pas qu'il faille étendre davantage cette publication.

33
ata

En bash, vous pouvez essayer ceci:

stringZ=abcABC123ABCabc
#       0123456789.....
#       0-based indexing.

echo ${stringZ:0:2} # prints ab

Plus d'échantillons dans The Linux Documentation Project

18
Juanma

expr(1) a une sous-commande substr:

expr substr <string> <start-index> <length>

Cela peut être utile si vous n'avez pas bash (peut-être Linux intégré) et que vous ne voulez pas le processus "echo" supplémentaire dont vous avez besoin pour utiliser cut (1).

13
camh
${string:position:length}
6
Bill the Lizard