ฉันเจอโซลูชันนี้สำหรับการพิมพ์บรรทัดที่ระบุจากไฟล์ข้อความ:
sed '123!d;q' file
ทำไมจึงไม่เลิกหลังจากบรรทัดแรกของอินพุตในกรณีนี้
ฉันเจอโซลูชันนี้สำหรับการพิมพ์บรรทัดที่ระบุจากไฟล์ข้อความ:
sed '123!d;q' file
ทำไมจึงไม่เลิกหลังจากบรรทัดแรกของอินพุตในกรณีนี้
คำตอบ:
ในภาษาอังกฤษ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;q;}ไม่ควรqใช้กับทุกบรรทัด
qใช้กับทุกบรรทัดที่มีการดำเนินการ แต่เมื่อหมายเลขบรรทัดไม่ใช่ 123 dคำสั่งจะถูกดำเนินการและความหมายของมันจะข้ามไปที่บรรทัดอินพุตถัดไปทันที
sed -n 123p(พิมพ์เอาต์พุตเดียวกัน) ยกเว้นมันจะหยุดหลังจากบรรทัดที่ 123 แทนการประมวลผลที่อาจเกิดขึ้นอีกหลายพันบรรทัดที่มันจะไม่ทำอะไรกับ anyways
!ถูกเชื่อมต่อกับไม่d123