แยกคำที่สองออกจากตัวแปรสตริง


11

ฉันมีสตริงที่เก็บไว้ในตัวแปร"rtcpOnNbActive true" xฉันต้องการแยก "true" เป็นสตริงย่อยและเก็บไว้ในตัวแปร ฉันจะทำสิ่งนี้ได้อย่างไร


จะมีช่องว่างเสมอxก่อน substring ที่คุณต้องการแยกหรือไม่
PM 2Ring

คำตอบ:


21

ลองด้วยวิธีนี้:

y=$(echo $x | awk '{print $2}')
echo $y
  • echo $xxแสดงค่าของ
  • awk '{print $2}'xพิมพ์ข้อมูลที่สองของการแสดงก่อนหน้านี้
  • $(... ถือออกและให้กำหนดให้)y

3
echo $xจะไม่ แสดงค่าของ xprintf '%s\n' "$x"อยากจะเป็น.
Stéphane Chazelas

2
awk '{print $2}'พิมพ์ฟิลด์ที่สองของแต่ละบรรทัดxของที่แสดงก่อนหน้านี้
Stéphane Chazelas

9

สมมติว่ามีอย่างน้อยหนึ่งช่องว่างก่อนสตริงย่อยที่คุณต้องการแยก (และสตริงย่อยไม่มีช่องว่างใด ๆ ) คุณสามารถทำได้ด้วยการขยายพารามิเตอร์อย่างง่าย:

x="rtcpOnNbActive     true"
y="${x##* }"
echo "[$y]"

เอาท์พุต

[true]

3
echoไม่ใช่แบบพกพาสำหรับสิ่งอื่นนอกเหนือจากสตริงตัวอักษรที่ไม่ได้ขึ้นต้นด้วย-และไม่มีลำดับการหลีกเลี่ยงใด ๆ พฤติกรรมของมันจะแตกต่างกันไปสำหรับ bash builtin ขึ้นอยู่กับว่ามันถูกคอมไพล์แล้วและXPG_ECHOถูกตั้งค่าอย่างไร สมมติว่าสตริงนั้นไม่มี escape sequences นี่น่าจะดี แต่printf '[%s]\n' "$y"ก็ยังดีกว่า
nyuszika7h

1
@ nyuszika7h: จุดดีและหลังจากได้อ่านStéphane Chazelas พูดสิ่งที่คล้ายกันที่นี่และในคำถามล่าสุดอื่น ๆ ฉันควรแบ่งนิสัยการใช้echoเพื่อแสดงค่าของตัวแปรแม้ในตัวอย่าง "ทิ้ง" เช่นนี้
PM 2Ring

4

คุณสามารถใช้ 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 และ$หมายถึงในตอนท้าย


2
อย่าโพสต์เนื้อหาของคำตอบอื่น ๆสำหรับคำถามเดียวกัน
αғsнιη

1
สิ่งที่คนอื่นตอบ ????
Hackaholic

เขาสามารถบันทึกไว้ในตัวแปรไม่ใช่เรื่องใหญ่ที่นี่
Hackaholic

echoไม่ใช่แบบพกพาสำหรับสิ่งอื่นนอกเหนือจากสตริงตัวอักษรที่ไม่ได้ขึ้นต้นด้วย-และไม่มีลำดับการหลีกเลี่ยงใด ๆ พฤติกรรมของมันจะแตกต่างกันไปสำหรับ bash builtin ขึ้นอยู่กับว่ามันถูกคอมไพล์แล้วและXPG_ECHOถูกตั้งค่าอย่างไร นอกจากนี้คุณควรเสมอคู่ขยายตัวแปรอ้างและคำสั่งเปลี่ยนตัว (มีข้อยกเว้นบางอย่างที่มันไม่จำเป็น แต่ก็ไม่ได้ทำอันตรายใดใด) ด้วยสตริงเช่น OP ของสิ่งนี้ควรจะดี แต่ถ้าคุณต้องการให้แน่ใจว่าprintf '%s\n' "${a##* }"จะดีกว่า
nyuszika7h

3

เป็นไปได้ที่จะใช้ bash arrays สำหรับสิ่งนั้นเช่น:

arr="(first second third)"
echo ${arr[1]}

2

คุณสามารถใช้ในreadตัว

read -r _ y <<<"$x"
printf "%s\n" "$y"
true

ทำไมถึงเกี่ยวข้องกับread? มันไม่ได้เป็นreadที่ไม่แยก - $IFSมันเป็น ด้วยเหตุผลบางอย่างที่คนจำนวนมากคิดว่ามันโอเคที่จะแยก w / $IFS เฉพาะเมื่อreadมีส่วนเกี่ยวข้อง คุณสามารถทำได้: set -f; IFS=' '; printf %.0s%s $xหรืออะไรก็ตาม ไม่ว่าในกรณีใด - คุณต้องระบุ$IFSค่าของที่นี่
mikeserv

@mikeserv ก็readทำแยกโดยใช้IFSการตรวจสอบเอกสาร ข้อได้เปรียบหลักของการใช้ read คือการตั้งค่าตัวแปร (ซึ่งเป็นข้อกำหนดของ OP) และกำหนดว่าสามารถแยกสตริงและสร้างอาร์เรย์ได้ซึ่งเหมาะสำหรับการแยกเขตข้อมูลออกจากสตริง นอกจากนี้ฉันสมมติว่าเริ่มต้นIFSที่นี่ แต่มันง่ายพอที่จะตั้งค่าหากจำเป็นIFS=$' \n\t' read -r _ y <<<"$x"จะทำเคล็ดลับ
iruvar

ไม่มันไม่ใช่. readกำหนด$IFSแยก ถ้าคุณต้องการที่จะเติมอาเรย์ใช้set- คุณไม่จำเป็นต้องมีเรื่องไร้สาระที่นี่สตริงในกรณีที่ unset IFSรับค่าเริ่มต้น $ IFS พฤติกรรม
mikeserv

@mikeserv คุณออกจากรายการการ์ดคริสต์มาสของฉัน
iruvar

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