91 votes

Quelle commande shell linux 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 - imprime cde .


Question similaire ultérieure:

167voto

Toybuilder Points 4143

Si vous recherchez un utilitaire shell capable de faire quelque chose comme ça, vous pouvez utiliser la commande cut.

Pour prendre votre exemple, essayez:

 echo "abcdefg" | cut -c3-5
 

-cN-M tells la commande cut pour renvoyer les colonnes N à M , inclus.

95voto

dmckee Points 50318

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 .

34voto

ata Points 996

Dans "pur" bash vous disposez de nombreux outils pour les (sous -) de manipulation de chaîne, principalement, mais non exclusivement dans le paramètre d'extension :

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

Indexé sous-chaîne d'extension (spécial comportements avec les décalages négatifs, et, dans de nouveaux Buffets, des longueurs négatives):

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

Et bien sûr, le plus utile des expansions qui opèrent sur 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 tweakable comportements que ceux de la liste, et comme je l'ai dit, il y a d'autres façons de manipuler des chaînes de caractères (une courante étant l' $(command substitution) combiné avec sed ou tout autre filtre externe). Mais, ils sont donc facilement trouvés en tapant man bash que je ne pense pas qu'il mérite de prolonger ce post.

19voto

Juanma Points 2648

En bash, vous pouvez essayer ceci:

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

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

Plus d'exemples dans The Linux Documentation Project

13voto

camh Points 13169

expr (1) a une sous-commande substr:

 expr substr string position 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).

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