Come ottenere la prima lettera in una variabile Bash?


88

Ho una variabile Bash $word, che a volte è una parola o una frase, ad esempio:

word="tiger"

O:

word="This is a sentence."

Come posso creare una nuova variabile Bash che sia uguale solo alla prima lettera trovata nella variabile? Ad esempio, quanto sopra sarebbe:

echo $firstletter
t

O:

echo $firstletter
T

Risposte:


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

Ogni volta che dici "primo" nella descrizione del problema, headè probabile che tu possa risolverlo.


8
Tieni presente che non è presente alcuna -copzione in POSIX head: < unix.com/man-page/posix/1/head >.
gioele

9
Questo restituisce la prima lettera, ma è eccessivo e la soluzione dipende dalle utilità esterne (head). Questo può essere fatto in puro guscio, che è più pulito.
automatthias

26
Questa non dovrebbe essere la risposta accettata, per le ragioni evidenziate dai commenti precedenti. Le vere risposte sono sotto - ${word:0:1}o ${word::1}.
noamtm

Per la conformità POSIX si potrebbe fare echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"o printf '%c' "$X"ma questi sono tutti soggetti a imbrogli a carattere singolo e multi byte.
phicr

Aspetta, così è head -c n, whoops. echo "fábio" | head -c 2f� , quindi questo è un altro problema con questo immagino.
phicr

285
word="tiger"
firstletter=${word:0:1}

9
Esattamente quello che stavo cercando. One-liner, senza deposizione delle uova subshell. Prendi il mio voto!
Tihomir Mitkov

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

1
Sarebbe meraviglioso, ma non funziona per me, né in bash 4.3.11 né in zsh 5.0.5
yoniLavi

1
Con GNU bash v4.3.11, firstè impostato sulla lettera s. Puoi vederlo con echo $s. Se non funziona per te e desideri aiuto per il debug, copia e incolla i comandi che hai digitato e il loro output.
Adam Liss

2
Grazie Adam, colpa mia, non riesco a capire perché prima non funzionasse per me, ma ora funziona perfettamente su diverse versioni di bash che ho provato, tornando a GNU bash, v3.1.0. Ancora non funziona in zsh, ma la domanda è contrassegnata con "bash", quindi è irrilevante.
yoniLavi

Grazie per il seguito e la conferma! Sono contento che funzioni per te.
Adam Liss



2

Dato che hai un sedtag, ecco una sedrisposta:

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

Suona per gioco per coloro che amano quelli (lo faccio!):

{

  • s: avvia una routine di sostituzione
    • /: Inizia a specificare cosa deve essere sostituito
    • ^\(.\): cattura il primo carattere nel gruppo 1
    • .*:, assicurati che il resto della linea sarà nella sostituzione
    • /: inizia a specificare la sostituzione
    • \1: inserire il gruppo 1
    • /: Il resto viene scartato;
  • q: Esci in sedmodo che non ripeta questo blocco per altre righe se ce ne sono.

}

È stato divertente! :)È inoltre possibile utilizzare greped ecc, ma se siete bashnella ${x:0:1}magia è ancora la soluzione migliore imo. (Ho passato un'ora a provare a utilizzare l'espansione della variabile POSIX per farlo ma non ci sono riuscito :( )


1

Utilizzando bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.