Score:1

ในบรรทัดข้อความโดยพลการ bash จะแยกค่าที่มีชื่อหลังจากเครื่องหมายเท่ากับได้อย่างไร

ธง ao

คำถามนี้ (วิธีรับค่าหลังจากเครื่องหมายเท่ากับ) เป็นสิ่งที่ฉันต้องการโดยพื้นฐาน:

กำหนดบรรทัดข้อความโดยมีชื่อพารามิเตอร์ที่มีลักษณะเหมือนไวยากรณ์ สี=แดงโดยใช้ bash คุณจะคว้าค่าสีนั้นได้อย่างไร (yielding สีแดง)?

ยกเว้นในคำถามนั้น บรรทัดข้อความเป็นคู่คีย์-ค่าทั้งหมด ดังนั้นคำตอบที่ยอมรับจึงใช้ bash อีวาล เนื่องจากไวยากรณ์นั้นเข้ากันได้ดีมาก


ฉันสงสัยเกี่ยวกับบรรทัดข้อความทั่วไปเช่น â â³ Synaptics TM3289-021 id=13 ] ฉันจะคว้าค่า id นั้นได้อย่างไร (yielding 13)?

อาจใช้ regex ซึ่งฉันรู้ว่าบรรทัดนั้นจะมี [ช่องว่าง]id=<ข้อความที่ฉันต้องการ>[ช่องว่าง]?

bac0n avatar
cn flag
`xinput list --id-only "Logitech USB Receiver Mouse"` คุณสามารถรับ id จาก xinput ได้โดยตรง
Score:2
ธง it

ใช้ เกรป's -o (ส่งออกเฉพาะข้อความที่ตรงกัน) ตัวเลือกอ่าน ผู้ชายเกรป และทำ:

echo "พวง. text id=13 more=4" | \
  grep -E -o 'id=[0-9]+`

หากคุณต้องการเพิ่มความระมัดระวัง ให้จับคู่ช่องว่างนำหน้าและต่อท้ายด้วย:

echo "พวง. text id=13 more=4" | \
  grep -E -o ' id=[0-9]+ '
tscizzle avatar
ao flag
สุดยอด! จากนั้นฉันคิดว่ามันง่ายพอที่จะขัดขวางสตริงผลลัพธ์ที่เริ่มต้นหลังจากตัวอักษรตัวแรก (เนื่องจาก "id=" คือ 3 ตัวอักษร) และฉันจะค้นหาวิธีค้นหาช่องว่างรอบ ๆ ไม่ใช่แค่ช่องว่าง (ฉันคิดว่ากรณีของฉันมีแท็บ)
bac0n avatar
cn flag
@tscizzle ถ้าคุณต้องการตัวเลขทั้งหมดจาก เช่น id= คุณสามารถใช้ lookbehind: `grep -Po '(?
terdon avatar
cn flag
@tscizzle คุณยังสามารถใช้นิพจน์ทั่วไปที่เข้ากันได้กับ Perl ซึ่งมี `\K` สำหรับ "ละเว้นสิ่งที่จับคู่จนถึงจุดนี้" ซึ่งให้คุณทำ: `grep -oP 'id=\K[0-9]+`
Score:1
ธง hr

ถ้าคุณต้องการจริงๆ ทุบตี หากต้องการแยกค่า คุณสามารถใช้ regex กับ =~ ตัวดำเนินการภายใน [[ ... ]] วงเล็บทดสอบ เช่น:

$ re='\bid=([^[:blank:]]*)'
$ line='â â³ Synaptics TM3289-021 id=13 ]'
$ 
$ [[ $line =~ $re ]] && printf '%d\n' "${BASH_REMATCH[1]}"
13

โปรดทราบว่าฉันใช้ \b (ขอบเขตคำ) แทนที่จะเป็นช่องว่างเป็นจุดยึดเริ่มต้น - ที่ช่วยให้นิพจน์ตรงกันในกรณีที่ รหัส=13 เกิดขึ้นที่จุดเริ่มต้นของเส้นและระหว่างทาง

หากคุณต้องการใช้ grep ฉันขอแนะนำให้ใช้โหมดที่เข้ากันได้กับ perl ของ GNU grep เพื่อให้คุณสามารถจับคู่ แต่ไม่รวม รหัส= ส่วน:

$printf '%s\n' "$line" | grep -Po '(?<=id=)\w*'
13

หรือ

$printf '%s\n' "$line" | grep -Po 'id=\K\w*'
13

ที่นี่, \w* จับคู่ลำดับ (อาจว่างเปล่า) ของอักขระคำ - หาก ypu ต้องการจับคู่เฉพาะ ID ตัวเลข คุณสามารถเปลี่ยนได้ \w ถึง \d.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา