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

Jawaban:


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

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


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


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

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



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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.