ฉันมีรหัสต่อไปนี้ที่จะลบบรรทัดที่มีรูปแบบbanana
และ 2 บรรทัดหลังจากนั้น:
sed '/banana/I,+2 d' file
จนถึงตอนนี้ดีมาก! แต่ฉันต้องการมันเพื่อลบ 2 บรรทัดก่อนหน้า banana
แต่ฉันไม่สามารถรับมันด้วย "เครื่องหมายลบ" หรืออะไรก็ตาม (คล้ายกับสิ่งที่grep -v -B2 banana file
ควรทำ แต่ไม่ได้ทำ):
teresaejunior@localhost ~ > LC_ALL=C sed '-2,/banana/I d' file
sed: invalid option -- '2'
teresaejunior@localhost ~ > LC_ALL=C sed '/banana/I,-2 d' file
sed: -e expression #1, char 16: unexpected `,'
teresaejunior@localhost ~ > LC_ALL=C sed '/banana/I,2- d' file
sed: -e expression #1, char 17: unknown command: `-'
tac file | sed ... | tac
เพียงแค่ทำ : P
sed '/banana/,+2d' file
นั้นได้ซึ่งจะใช้ได้
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein
เนื่องจากนี่เป็นความคิดเห็นและไม่ใช่คำตอบ (มีคำตอบอื่น ๆ อยู่แล้ว) ฉันจะไม่พูดถึงรายละเอียดมากนัก แต่สิ่งที่สำคัญที่สุดคือคุณมี ก่อนหน้านี้สองระเบียนในก่อนหน้า [0] และก่อนหน้า [1] ที่ "สดใหม่" ซึ่งขึ้นอยู่กับการย้ำเสมอ แต่ในprev[idx]
ดังนั้นเมื่อคุณพิมพ์คุณพิมพ์ใน!idx
แล้วidx
การสั่งซื้อ โดยไม่คำนึงถึงทางเลือกและใส่ระเบียนปัจจุบันในidx
prev[idx]
awk '{l[m=NR]=$0}/banana/{for(i=NR-2;i<=NR;i++)delete l[i]}END{for(i=1;i<=m;i++)if(i in l)print l[i]}'
ที่ง่ายที่สุดคือการโหลดข้อมูลทั้งหมดเป็นอาร์เรย์ข้ามเส้นที่ไม่พึงประสงค์แล้วออกสิ่งที่เหลืออยู่: มันไม่มีประสิทธิภาพดังนั้นนี่เป็นเพียงคำใบ้ไม่ใช่วิธีแก้ปัญหา