Jak uzyskać pierwszą literę w zmiennej Bash?

88

Mam zmienną Bash $word, która czasami jest słowem lub zdaniem np:

word="tiger"

Lub:

word="This is a sentence."

Jak mogę utworzyć nową zmienną Bash, która jest równa tylko pierwszej literze znalezionej w zmiennej? Np. Powyższe byłoby:

echo $firstletter
t

Lub:

echo $firstletter
T
Wioska
źródło

Odpowiedzi:

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

Za każdym razem, gdy w opisie problemu powiesz „pierwszy”, headjest to prawdopodobne rozwiązanie.

thiton
źródło
8
Zwróć uwagę, że -cw nagłówku POSIX nie ma opcji: < unix.com/man-page/posix/1/head >.
gioele,
9
Zwraca to pierwszą literę, ale jest to przesada, a rozwiązanie zależy od zewnętrznych narzędzi (głowa). Można to zrobić w czystej skorupie, która jest czystsza.
automatthias,
26
Nie powinna to być akceptowana odpowiedź z powodów wskazanych w powyższych komentarzach. Prawdziwe odpowiedzi znajdują się poniżej - ${word:0:1}lub ${word::1}.
noamtm
Dla zgodności z POSIX można zrobić echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"albo printf '%c' "$X", ale te są przedmiotem pojedynczej v. Wielo shenanigans znaków bajt.
phicr
Czekaj, tak jest head -c n, ups. echo "fábio" | head -c 2daje f� , więc to chyba kolejny problem z tym.
phicr
281
word="tiger"
firstletter=${word:0:1}
Karoly Horvath
źródło
9
Dokładnie to, czego szukałem. Jednowierszowy, bez tworzących się podpowłok. Odbierz mój głos!
Tihomir Mitkov
73
word=something
first=${word::1}
Adam Liss
źródło
1
Byłoby wspaniale, ale u mnie nie działa, ani w bashu 4.3.11, ani w zsh 5.0.5
yoniLavi
1
W przypadku GNU bash v4.3.11 firstjest ustawiony na literę s. Możesz to zobaczyć echo $s. Jeśli to nie zadziała i chcesz pomóc w debugowaniu, skopiuj i wklej wpisane polecenia i ich wyniki.
Adam Liss
2
Dzięki Adam, moja wina, nie mogę zrozumieć, dlaczego wcześniej mi to nie działało, ale teraz działa doskonale w kilku wersjach bash, które próbowałem, wracając do GNU bash, v3.1.0. Nadal nie działa w zsh, ale pytanie jest oznaczone jako „bash”, więc to nie ma znaczenia.
yoniLavi
Dzięki za skontaktowanie się i potwierdzenie! Cieszę się, że to działa dla Ciebie.
Adam Liss
6

Z krojem:

word='tiger'
echo "${word}" | cut -c 1
Franckyz
źródło
2

Ponieważ masz sedtag, oto sedodpowiedź:

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

Graj przez grę dla tych, którzy je lubią (ja!):

{

  • s: rozpocznij procedurę zastępowania
    • /: Rozpocznij określanie, co ma zostać zastąpione
    • ^\(.\): złap pierwszą postać z grupy 1
    • .*:, upewnij się, że reszta linii będzie w zamianie
    • /: rozpocznij określanie zamiany
    • \1: wstaw grupę 1
    • /: Reszta jest odrzucana;
  • q: Zakończ, sedaby nie powtórzył tego bloku dla innych linii, jeśli takie istnieją.

}

To była zabawa! :)Można również użyć grepi etc, ale jeśli jesteś w bashtej ${x:0:1}magii jest jeszcze lepszym rozwiązaniem imo. (Spędziłem około godziny próbując użyć do tego celu rozwijania zmiennych POSIX, ale nie mogłem :( )

phicr
źródło
1

Korzystanie z bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
leogtzr
źródło