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

Odpowiedzi:


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

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


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


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

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



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 :( )


1

Korzystanie z bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.