จะรับตัวอักษรตัวแรกในตัวแปร Bash ได้อย่างไร?


88

ฉันมีตัวแปร Bash $wordซึ่งบางครั้งอาจเป็นคำหรือประโยคเช่น:

word="tiger"

หรือ:

word="This is a sentence."

ฉันจะสร้างตัวแปร Bash ใหม่ซึ่งเท่ากับเฉพาะอักษรตัวแรกที่พบในตัวแปรได้อย่างไร เช่นข้างต้นจะเป็น:

echo $firstletter
t

หรือ:

echo $firstletter
T

คำตอบ:


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

ทุกครั้งที่คุณพูดว่า "ก่อน" ในคำอธิบายปัญหาของคุณheadเป็นวิธีแก้ปัญหา


8
โปรดทราบว่าไม่มี-cตัวเลือกใน POSIX head: < unix.com/man-page/posix/1/head >
gioele

9
สิ่งนี้จะส่งคืนอักษรตัวแรก แต่เป็นการใช้งานมากเกินไปและการแก้ปัญหาขึ้นอยู่กับยูทิลิตี้ภายนอก (head) สามารถทำได้ในเปลือกบริสุทธิ์ซึ่งสะอาดกว่า
automatthias

26
นี่ไม่ควรเป็นคำตอบที่ได้รับการยอมรับด้วยเหตุผลที่ระบุไว้ในความคิดเห็นข้างต้น คำตอบที่แท้จริงอยู่ด้านล่าง - หรือ${word:0:1} ${word::1}
noamtm

สำหรับการปฏิบัติตาม POSIX คุณสามารถทำecho "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"หรือprintf '%c' "$X"แต่เหล่านี้เป็นเรื่องที่ทุกคนที่จะวีเดียว. แง่ของตัวละครหลายไบต์
phicr

เดี๋ยวก่อนhead -c nอ๊ะ echo "fábio" | head -c 2ให้f� เพื่อให้เป็นอีกปัญหาหนึ่งที่มีฉันเดานี้
phicr


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

1
สิ่งนี้จะยอดเยี่ยม แต่ไม่ได้ผลสำหรับฉันทั้งใน bash 4.3.11 หรือใน zsh 5.0.5
yoniLavi

1
ด้วยการทุบตี GNU v4.3.11, การตั้งค่าไปยังตัวอักษรfirst sคุณสามารถดูได้ด้วยecho $s. หากไม่ได้ผลสำหรับคุณและคุณต้องการความช่วยเหลือในการแก้ไขข้อบกพร่องโปรดคัดลอกและวางคำสั่งที่คุณพิมพ์และผลลัพธ์ของคำสั่งนั้น
Adam Liss

2
ขอบคุณอดัมฉันไม่ดีฉันคิดไม่ออกว่าทำไมมันถึงไม่ได้ผลสำหรับฉันมาก่อน แต่ตอนนี้มันใช้งานได้ดีอย่างสมบูรณ์กับ bash หลายรุ่นที่ฉันลองกลับไปที่ GNU bash, v3.1.0 ยังใช้ไม่ได้ใน zsh แต่คำถามถูกแท็ก "bash" ดังนั้นจึงไม่เกี่ยวข้อง
yoniLavi

ขอบคุณสำหรับการติดตามและยืนยัน! ดีใจที่ได้ผลสำหรับคุณ
Adam Liss



2

เนื่องจากคุณมีsedแท็กนี่คือsedคำตอบ:

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

เล่นโดยเล่นสำหรับผู้ที่ชอบสิ่งเหล่านั้น (ฉันทำ!):

{

  • s: เริ่มรูทีนการทดแทน
    • /: เริ่มระบุสิ่งที่จะทดแทน
    • ^\(.\): จับอักขระตัวแรกในกลุ่ม 1
    • .*: ตรวจสอบให้แน่ใจว่าส่วนที่เหลือของบรรทัดอยู่ในการเปลี่ยนตัว
    • /: เริ่มระบุการเปลี่ยน
    • \1: แทรกกลุ่ม 1
    • /: ส่วนที่เหลือทิ้ง;
  • q: ออกsedเพื่อไม่ให้บล็อกนี้ซ้ำสำหรับบรรทัดอื่น ๆ หากมี

}

สนุกดี! :)นอกจากนี้คุณยังสามารถใช้grepและอื่น ๆ แต่ถ้าคุณอยู่ในเวทมนตร์ยังคงเป็นทางออกที่ดีกว่า IMO (ฉันใช้เวลาประมาณหนึ่งชั่วโมงในการพยายามใช้การขยายตัวแปร POSIX เพื่อทำสิ่งนั้น แต่ทำไม่ได้ )bash${x:0:1}:(


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.