Como obter a primeira letra de uma variável Bash?


88

Eu tenho uma variável Bash,, $wordque às vezes é uma palavra ou frase, por exemplo:

word="tiger"

Ou:

word="This is a sentence."

Como posso criar uma nova variável Bash que seja igual apenas à primeira letra encontrada na variável? Por exemplo, o acima seria:

echo $firstletter
t

Ou:

echo $firstletter
T

Respostas:


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

Cada vez que você disser "primeiro" na descrição do problema, headé uma solução provável.


8
Observe que não há -copção no cabeçote POSIX: < unix.com/man-page/posix/1/head >.
gioele

9
Isso retorna a primeira letra, mas é um exagero, e a solução depende de utilitários externos (cabeça). Isso pode ser feito em casca pura, que é mais limpa.
automatthias,

26
Esta não deve ser a resposta aceita, pelos motivos apontados nos comentários anteriores. As verdadeiras respostas estão abaixo - ${word:0:1}ou ${word::1}.
noamtm

Para conformidade com POSIX, você pode fazer echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"ou printf '%c' "$X"mas todos estão sujeitos a travessuras de caracteres de byte único v.
phicr 01 de

Espere, então está head -c n, ops. echo "fábio" | head -c 2f� , então esse é outro problema com isso, eu acho.
phicr 01 de


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

1
Isso seria maravilhoso, mas não funciona para mim, nem no bash 4.3.11 nem no zsh 5.0.5
yoniLavi

1
Com o GNU bash v4.3.11, firstestá tudo certo s. Você pode ver isso com echo $s. Se isso não funcionar para você e você quiser ajuda na depuração, copie e cole o (s) comando (s) que você digitou e sua saída.
Adam Liss

2
Obrigado Adam, que coisa, não consigo descobrir por que não funcionou para mim antes, mas funciona perfeitamente bem agora em várias versões do bash que experimentei, voltando ao GNU bash, v3.1.0. Ainda não funciona no zsh, mas a questão está marcada como "bash", então isso é irrelevante.
yoniLavi

Obrigado por acompanhar e confirmar! Que bom que está funcionando para você.
Adam Liss



2

Já que você tem uma sedtag, aqui está uma sedresposta:

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

Jogo a jogo para quem gosta disso (eu gosto!):

{

  • s: iniciar uma rotina de substituição
    • /: Comece especificando o que deve ser substituído
    • ^\(.\): captura o primeiro personagem do Grupo 1
    • .*:, certifique-se de que o resto da linha estará na substituição
    • /: comece especificando a substituição
    • \1: inserir Grupo 1
    • /: O resto é descartado;
  • q: Saia sedpara não repetir este bloco para outras linhas, se houver.

}

Bem, isso foi divertido! :)Você também pode usar grepe etc, mas se você estiver bashna ${x:0:1}magia ainda é a melhor solução imo. (Passei uma hora tentando usar a expansão de variável POSIX para fazer isso, mas não consegui :( )


1

Usando o bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.