Comment obtenir la première lettre d'une variable Bash?


88

J'ai une variable Bash,, $wordqui est parfois un mot ou une phrase, par exemple:

word="tiger"

Ou:

word="This is a sentence."

Comment puis-je créer une nouvelle variable Bash qui n'est égale qu'à la première lettre trouvée dans la variable? Par exemple, ce qui précède serait:

echo $firstletter
t

Ou:

echo $firstletter
T

Réponses:


37
initial="$(echo $word | head -c 1)"

Chaque fois que vous dites «d'abord» dans la description de votre problème, headune solution est probable.


8
Veuillez noter qu'il n'y a pas d' -coption dans POSIX head: < unix.com/man-page/posix/1/head >.
gioele

9
Cela renvoie la première lettre, mais c'est exagéré, et la solution dépend des utilitaires externes (head). Cela peut être fait dans une coque pure, qui est plus propre.
automatthias

26
Cela ne devrait pas être la réponse acceptée, pour les raisons indiquées par les commentaires ci-dessus. Les vraies réponses sont ci-dessous - ${word:0:1}ou ${word::1}.
noamtm

Pour la conformité POSIX, vous pouvez le faire echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"ou printf '%c' "$X"mais ceux-ci sont tous soumis à des manigances de caractères à un ou plusieurs octets.
phicr

Attendez, oui head -c n, oups. echo "fábio" | head -c 2donne f� , donc c'est un autre problème avec cela, je suppose.
phicr


73
word=something
first=${word::1}

1
Ce serait merveilleux, mais ne fonctionne pas pour moi, ni dans bash 4.3.11 ni dans zsh 5.0.5
yoniLavi

1
Avec GNU bash v4.3.11, firstest mis à la lettre s. Vous pouvez le voir avec echo $s. Si cela ne fonctionne pas pour vous et que vous souhaitez obtenir de l'aide pour le débogage, copiez et collez la ou les commandes que vous avez tapées et leur sortie.
Adam Liss

2
Merci Adam, mon mauvais, je ne peux pas comprendre pourquoi cela n'a pas fonctionné pour moi avant, mais cela fonctionne parfaitement bien maintenant sur plusieurs versions de bash que j'ai essayées, pour revenir à GNU bash, v3.1.0. Ne fonctionne toujours pas dans zsh, mais la question est étiquetée "bash", donc ce n'est pas pertinent.
yoniLavi

Merci pour le suivi et la confirmation! Heureux que cela fonctionne pour vous.
Adam Liss le



2

Puisque vous avez une sedbalise, voici une sedréponse:

echo "$word" | sed -e "{ s/^\(.\).*/\1/ ; q }"

Jouez par jeu pour ceux qui aiment ceux-là (je le fais!):

{

  • s: démarrer une routine de substitution
    • /: Commencez à spécifier ce qui doit être remplacé
    • ^\(.\): capturez le premier personnage du groupe 1
    • .*:, assurez-vous que le reste de la ligne sera dans la substitution
    • /: commencez à spécifier le remplacement
    • \1: insérer le groupe 1
    • /: Le reste est rejeté;
  • q: Quittez sedpour qu'il ne répète pas ce bloc pour les autres lignes s'il y en a.

}

Eh bien, c'était amusant! :)Vous pouvez également utiliser grepet etc, mais si vous êtes dans bashla ${x:0:1}magie, c'est toujours la meilleure solution imo. (J'ai passé environ une heure à essayer d'utiliser l'extension de variable POSIX pour le faire, mais je n'ai pas pu :( )


1

Utilisation de bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.