Bagaimana cara mendapatkan huruf pertama dalam variabel Bash?

88

Saya memiliki variabel Bash $word, yang terkadang berupa kata atau kalimat, misalnya:

word="tiger"

Atau:

word="This is a sentence."

Bagaimana cara membuat variabel Bash baru yang sama dengan huruf pertama yang ditemukan di variabel? Misalnya, di atas akan menjadi:

echo $firstletter
t

Atau:

echo $firstletter
T
Desa
sumber

Jawaban:

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

Setiap kali Anda mengatakan "pertama" dalam deskripsi masalah Anda, headadalah solusi yang mungkin.

ini
sumber
8
Harap dicatat bahwa tidak ada -copsi di kepala POSIX: < unix.com/man-page/posix/1/head >.
gioele
9
Ini mengembalikan huruf pertama, tetapi itu berlebihan, dan solusinya tergantung pada utilitas eksternal (kepala). Ini bisa dilakukan di cangkang murni, yang lebih bersih.
automatthias
26
Ini seharusnya bukan jawaban yang diterima, karena alasan yang ditunjukkan oleh komentar di atas. Jawaban sebenarnya ada di bawah - ${word:0:1}atau ${word::1}.
noamtm
Untuk kepatuhan POSIX Anda dapat melakukannya echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"atau printf '%c' "$X"tetapi ini semua tunduk pada kesalahan karakter tunggal v. Multi byte.
phicr
Tunggu, begitu juga head -c n, ups. echo "fábio" | head -c 2memberi f� , jadi itu masalah lain dengan ini saya kira.
phicr
285
word="tiger"
firstletter=${word:0:1}
Karoly Horvath
sumber
9
Persis apa yang saya cari. One-liner, tanpa subkulit pemijahan. Ambil suaraku!
Tihomir Mitkov
73
word=something
first=${word::1}
Adam Liss
sumber
1
Ini akan luar biasa, tetapi tidak berhasil untuk saya, baik di bash 4.3.11 maupun di zsh 5.0.5
yoniLavi
1
Dengan GNU bash v4.3.11, firstdiatur ke huruf s. Anda bisa melihatnya dengan echo $s. Jika itu tidak berhasil untuk Anda, dan Anda ingin bantuan debugging, silakan salin dan tempel perintah yang Anda ketikkan dan hasilnya.
Adam Liss
2
Terima kasih Adam, saya buruk, saya tidak tahu mengapa itu tidak berhasil untuk saya sebelumnya, tetapi berfungsi dengan baik sekarang di beberapa versi bash yang saya coba, kembali ke GNU bash, v3.1.0. Masih tidak berfungsi di zsh, tapi pertanyaannya diberi tag "bash", jadi itu tidak relevan.
yoniLavi
Terima kasih telah menindaklanjuti dan mengonfirmasi! Senang itu bekerja untuk Anda.
Adam Liss
6

Dengan potongan:

word='tiger'
echo "${word}" | cut -c 1
Franckyz
sumber
2

Karena Anda memiliki sedtag, inilah sedjawabannya:

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

Mainkan demi permainan untuk mereka yang menikmatinya (saya lakukan!):

{

  • s: memulai rutinitas substitusi
    • /: Mulai tentukan apa yang akan diganti
    • ^\(.\): tangkap karakter pertama di Grup 1
    • .*:, pastikan sisa baris akan berada di substitusi
    • /: mulai menentukan penggantinya
    • \1: masukkan Grup 1
    • /: Sisanya dibuang;
  • q: Keluar sedagar tidak mengulangi blok ini untuk baris lain jika ada.

}

Itu menyenangkan! :)Anda juga dapat menggunakan grepdan dll tapi jika Anda berada di bashdalam ${x:0:1}tenung masih solusi yang lebih baik imo. (Saya menghabiskan waktu satu jam mencoba menggunakan ekspansi variabel POSIX untuk melakukan itu tetapi tidak bisa :( )

phicr
sumber
1

Menggunakan bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
leogtzr.dll
sumber