คำสั่ง sed นี้ทำงานอย่างไร


12

ฉันเจอโซลูชันนี้สำหรับการพิมพ์บรรทัดที่ระบุจากไฟล์ข้อความ:

sed '123!d;q' file

ทำไมจึงไม่เลิกหลังจากบรรทัดแรกของอินพุตในกรณีนี้

คำตอบ:


20

ในภาษาอังกฤษsedโปรแกรมนี้หมายถึง: สำหรับแต่ละบรรทัด

  • [ 123!] ถ้าหมายเลขบรรทัดปัจจุบันไม่ใช่ 123 จากนั้น [ d] ลบบรรทัดปัจจุบันและเริ่มรอบถัดไป (เช่นย้ายไปยังบรรทัดถัดไป)
  • จากนั้น (แต่เรามาถึงจุดนี้หากdคำสั่งไม่ได้ถูกดำเนินการ), [ q] exit โดยไม่ประมวลผลบรรทัดใด ๆ อีกต่อไป (แต่พิมพ์บรรทัดปัจจุบันใน throes ที่กำลังจะตาย)

หรือหากคุณต้องการในรูปแบบเชลล์:

line_number=0
while IFS= read -r pattern_space; do
  line_number=$(($line_number+1))
  if [ $line_number -ne 123 ]; then       # 123!
    continue                              #   d
  fi
  echo "$pattern_space"; break            # q
  echo "$pattern_space"                   # implicit final print (never reached)
done

ขอบคุณที่เคลียร์ฉันด้วย ข้อผิดพลาดของฉันคือการที่ฉันเข้าใจ!ถูกเชื่อมต่อกับไม่d 123
rozcietrzewiacz

@Gilles: ไม่พบเครื่องหมายปีกกา{d;q;}ไม่ควรqใช้กับทุกบรรทัด
enzotib

1
@enzotib qใช้กับทุกบรรทัดที่มีการดำเนินการ แต่เมื่อหมายเลขบรรทัดไม่ใช่ 123 dคำสั่งจะถูกดำเนินการและความหมายของมันจะข้ามไปที่บรรทัดอินพุตถัดไปทันที
Gilles 'หยุดความชั่วร้าย'

คำอธิบายที่ชัดเจน
ราหุลปาติล

โดยพื้นฐานแล้วมันทำเช่นเดียวกับsed -n 123p(พิมพ์เอาต์พุตเดียวกัน) ยกเว้นมันจะหยุดหลังจากบรรทัดที่ 123 แทนการประมวลผลที่อาจเกิดขึ้นอีกหลายพันบรรทัดที่มันจะไม่ทำอะไรกับ anyways
Wildcard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.