ฉันมีสตริงที่เก็บไว้ในตัวแปร"rtcpOnNbActive true"
x
ฉันต้องการแยก "true" เป็นสตริงย่อยและเก็บไว้ในตัวแปร ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันมีสตริงที่เก็บไว้ในตัวแปร"rtcpOnNbActive true"
x
ฉันต้องการแยก "true" เป็นสตริงย่อยและเก็บไว้ในตัวแปร ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
ลองด้วยวิธีนี้:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
x
แสดงค่าของawk '{print $2}'
x
พิมพ์ข้อมูลที่สองของการแสดงก่อนหน้านี้$(
... ถือออกและให้กำหนดให้)
y
echo $x
จะไม่ แสดงค่าของ x
printf '%s\n' "$x"
อยากจะเป็น.
awk '{print $2}'
พิมพ์ฟิลด์ที่สองของแต่ละบรรทัดx
ของที่แสดงก่อนหน้านี้
สมมติว่ามีอย่างน้อยหนึ่งช่องว่างก่อนสตริงย่อยที่คุณต้องการแยก (และสตริงย่อยไม่มีช่องว่างใด ๆ ) คุณสามารถทำได้ด้วยการขยายพารามิเตอร์อย่างง่าย:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
เอาท์พุต
[true]
echo
ไม่ใช่แบบพกพาสำหรับสิ่งอื่นนอกเหนือจากสตริงตัวอักษรที่ไม่ได้ขึ้นต้นด้วย-
และไม่มีลำดับการหลีกเลี่ยงใด ๆ พฤติกรรมของมันจะแตกต่างกันไปสำหรับ bash builtin ขึ้นอยู่กับว่ามันถูกคอมไพล์แล้วและXPG_ECHO
ถูกตั้งค่าอย่างไร สมมติว่าสตริงนั้นไม่มี escape sequences นี่น่าจะดี แต่printf '[%s]\n' "$y"
ก็ยังดีกว่า
echo
เพื่อแสดงค่าของตัวแปรแม้ในตัวอย่าง "ทิ้ง" เช่นนี้
คุณสามารถใช้ awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
จำนวนฟิลด์ในระเบียนปัจจุบัน
ใช้ sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
ใช้นิพจน์สตริง:
a="rtcpOnNbActive true"
echo ${a##* }
true
ใช้ grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
- o คือให้การแข่งขันที่แน่นอนเท่านั้น[a-z]+
จะจับคู่จดหมายจาก az และ$
หมายถึงในตอนท้าย
echo
ไม่ใช่แบบพกพาสำหรับสิ่งอื่นนอกเหนือจากสตริงตัวอักษรที่ไม่ได้ขึ้นต้นด้วย-
และไม่มีลำดับการหลีกเลี่ยงใด ๆ พฤติกรรมของมันจะแตกต่างกันไปสำหรับ bash builtin ขึ้นอยู่กับว่ามันถูกคอมไพล์แล้วและXPG_ECHO
ถูกตั้งค่าอย่างไร นอกจากนี้คุณควรเสมอคู่ขยายตัวแปรอ้างและคำสั่งเปลี่ยนตัว (มีข้อยกเว้นบางอย่างที่มันไม่จำเป็น แต่ก็ไม่ได้ทำอันตรายใดใด) ด้วยสตริงเช่น OP ของสิ่งนี้ควรจะดี แต่ถ้าคุณต้องการให้แน่ใจว่าprintf '%s\n' "${a##* }"
จะดีกว่า
เป็นไปได้ที่จะใช้ bash arrays สำหรับสิ่งนั้นเช่น:
arr="(first second third)"
echo ${arr[1]}
คุณสามารถใช้ในread
ตัว
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? มันไม่ได้เป็นread
ที่ไม่แยก - $IFS
มันเป็น ด้วยเหตุผลบางอย่างที่คนจำนวนมากคิดว่ามันโอเคที่จะแยก w / $IFS
เฉพาะเมื่อread
มีส่วนเกี่ยวข้อง คุณสามารถทำได้: set -f; IFS=' '; printf %.0s%s $x
หรืออะไรก็ตาม ไม่ว่าในกรณีใด - คุณต้องระบุ$IFS
ค่าของที่นี่
read
ทำแยกโดยใช้IFS
การตรวจสอบเอกสาร ข้อได้เปรียบหลักของการใช้ read คือการตั้งค่าตัวแปร (ซึ่งเป็นข้อกำหนดของ OP) และกำหนดว่าสามารถแยกสตริงและสร้างอาร์เรย์ได้ซึ่งเหมาะสำหรับการแยกเขตข้อมูลออกจากสตริง นอกจากนี้ฉันสมมติว่าเริ่มต้นIFS
ที่นี่ แต่มันง่ายพอที่จะตั้งค่าหากจำเป็นIFS=$' \n\t' read -r _ y <<<"$x"
จะทำเคล็ดลับ
read
กำหนด$IFS
แยก ถ้าคุณต้องการที่จะเติมอาเรย์ใช้set
- คุณไม่จำเป็นต้องมีเรื่องไร้สาระที่นี่สตริงในกรณีที่ unset IFS
รับค่าเริ่มต้น $ IFS พฤติกรรม
x
ก่อน substring ที่คุณต้องการแยกหรือไม่