คำที่ N ในตัวแปรสตริง


87

ใน Bash ฉันต้องการรับคำที่ N ของสตริงโดยตัวแปร

ตัวอย่างเช่น:

STRING="one two three four"
N=3

ผลลัพธ์:

"three"

คำสั่ง / สคริปต์ Bash สามารถทำสิ่งนี้ได้อย่างไร

คำตอบ:


99
echo $STRING | cut -d " " -f $N

3
การตัดจะล้มเหลวเมื่อขอฟิลด์ที่ไม่มีอยู่ แทนที่จะส่งกลับ "" มันจะส่งคืนสตริงเอง ตัวอย่าง: echo "aaaa" | ผลลัพธ์ที่ตัด -f2 คือ "aaaa" ไม่ใช่ผลลัพธ์ที่มีความยาวเป็นศูนย์
ajaaskel

@ajaaskel ดูเหมือนว่าจะเกิดขึ้นเมื่อไม่พบตัวคั่นในอินพุต และในปัจจุบันพฤติกรรมดังกล่าวสามารถเปลี่ยนแปลงได้โดยใช้ตัวเลือก - เฉพาะคั่น
Samuli Pahaoja

64

ทางเลือก

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}

3
การใช้ bash arrays เป็นวิธีแก้ปัญหาที่ "ดีที่สุด" ฉันเกลียดการใช้ awk หรือ sed เนื่องจากไม่เห็นว่ามีการติดตั้งในการตั้งค่าทั้งหมดโดยเฉพาะการตั้งค่า msys
อาทิตย์

1
แม้ว่าเสียงสะท้อนจะ "ไม่จำเป็น" แต่ฉันก็พบว่ามีประโยชน์สำหรับการทำความเข้าใจวิธีใช้องค์ประกอบ arr ขอบคุณ
Chen Li Yong

1
หากคุณได้ตั้งค่าIFS(ตัวคั่นฟิลด์ภายใน) เป็น ':' หรือบางอย่างแทนที่จะเป็นช่องว่างให้เปลี่ยนกลับก่อนที่จะลองสิ่งนี้
Noumenon

1
นี่น่าจะเป็นคำตอบที่ใช่ การใช้อาร์เรย์เพื่อจุดประสงค์นี้ทำได้ง่ายและชาญฉลาด
ajaaskel

32

การใช้ awk

echo $STRING | awk -v N=$N '{print $N}'

ทดสอบ

% N=3
% STRING="one two three four"
% echo $STRING | awk -v N=$N '{print $N}'
three

9

ไฟล์ที่มีคำสั่งบางส่วน:

cat test.txt

ผลลัพธ์ :

This is the 1st Statement
This is the 2nd Statement
This is the 3rd Statement
This is the 4th Statement
This is the 5th Statement

ดังนั้นในการพิมพ์คำที่ 4 ของคำสั่งนี้ให้พิมพ์:

cat test.txt |awk '{print $4}'

เอาท์พุต:

1st
2nd
3rd
4th
5th

2
OP บอกว่าสตริงอยู่ในตัวแปรไม่ใช่ไฟล์
codeforester

3

ไม่มีส้อมราคาแพงไม่มีท่อไม่มีการทุบตี:

$ set -- $STRING
$ eval echo \${$N}
three

แต่ระวัง globbing


2
STRING=(one two three four)
echo "${STRING[n]}"

2
ในตัวอย่างของคุณ STRING เป็นสตริงจริงหรือ ดูเหมือนว่าอาร์เรย์
Nicolas Raoul

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