ฉันจะพิมพ์ทั้งหมดยกเว้นบรรทัดที่ N ถึงบรรทัดสุดท้ายได้อย่างไร?


9
  • ฉันต้องการทำส่วนประกอบ / "ตรงกันข้าม" ของ

    sed 13q;d <file.txt
    

    โดยทั่วไปแล้วเป็นไปได้ไหมที่เราจะทำส่วนเติมเต็ม / ผกผัน / ตรงกันข้ามในนี้sedหรือไม่? หรือเฉพาะสำหรับ regexes

  • ฉันจะพิมพ์ทั้งหมดยกเว้นบรรทัดที่สามถึงครั้งสุดท้ายได้อย่างไร สิ่งนี้ต้องใช้สองtacและนับไปข้างหน้าsedหรือไม่? หรือมีวิธีที่จะทำให้sedตัวเองนับจากด้านหลัง?

คำตอบ:


12

ส่วนที่ 1

เพียงแค่ลบdบรรทัดที่ 13:

sed '13d' <file.txt

และวิธีทั่วไปในการทำส่วนประกอบข้างต้นคือ:

sed '13!d' <file.txt

ส่วนที่ 2

เพราะสามารถทำได้:

sed -n ':a;${P;q};N;4,$D;ba' <file.txt

โปรดสังเกตว่า4มีมากกว่าหนึ่งหมายเลขที่คุณต้องการ ดังนั้นถ้าคุณต้องการที่บรรทัดสุดท้าย-10 11นี้จะเป็น

ทดสอบกับseq:

$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$ 

พยายามอธิบาย

:a        # define label a
${        # match the last line
    P     # print the first line of the pattern space
    q     # quit
}
N         # match all lines: append the next line to the pattern
4,${      # match the range of lines 4 to the end of the file
    D     # delete the first line of the pattern space
}
ba        # match all lines: jump back to label a 

การเพิ่มคุณค่าของ Glenn Jackman:

นั่นคือ "เฉพาะบรรทัดที่ N" นี่คือ "แต่ทั้งหมดบรรทัด Nth":

sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'

ทำงานร่วมกับ GNU sed, \nลำดับอาจไม่ทำงานกับ seds อื่น ๆ


ฉันลองสิ่งนี้กับ BSD sed (OSX) และพบว่ามันใช้งานไม่ได้ในรูปแบบข้างต้น ปัญหาดูเหมือนจะเป็น:

  1. ; ใช้เพื่อแยกบรรทัดโดยทั่วไปดูเหมือนว่าจะใช้งานได้ แต่ไม่ทำงานหลังจากติดป้ายกำกับ
  2. BSD sed ดูเหมือนจะต้องการ;หลังจากคำสั่งสุดท้ายใน{}กลุ่มคำสั่งหนึ่งบรรทัดในขณะที่ GNU sed ไม่
  3. \nโดยทั่วไปสามารถใช้ภายในนิพจน์ปกติ แต่ดูเหมือนจะไม่อยู่ใน[]นิพจน์วงเล็บเหลี่ยม ดังนั้นในการยกเว้นการขึ้นบรรทัดใหม่เราสามารถใช้สิ่งที่ต้องการ[[:alnum:][:punct:][:graph:][:blank:]]แทนได้แม้ว่าสิ่งนี้อาจยกเว้นอักขระอื่น ๆ (โดยเฉพาะอักขระควบคุมอื่น ๆ )

ดังนั้นนี่คือความพยายามในเวอร์ชันที่เป็นอิสระของแพลตฟอร์ม:

sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'

ดูเหมือนว่าจะทำงานภายใต้ OSX และ Ubuntu


@jimmij คำตอบอื่น ๆ เกี่ยวกับคำถามที่เกี่ยวข้องในเครือข่าย SE แนะนำว่าhead/ a tailsolution ช้ากว่าsedโซลูชันมาก ขอบคุณแม้ว่า
isomorphismes

3
@ isomorphism ไม่มีโปรแกรมที่สามารถทราบจำนวนบรรทัดในไฟล์ยกเว้นว่าจะผ่านทั้งไฟล์ ไม่มีทางรอบนั้น วิธีเดียวที่จะนับจากด้านล่างคือการย้อนกลับไฟล์และนับจากด้านบนหรือแยกสองครั้ง ดังนั้นหัว / หางจะค่อนข้างเร็วเท่ากับที่ได้รับ
terdon

@ isomorphismes ... เนื่องจากพวกเขา ( head/ tail) ได้รับการปรับให้เหมาะสมสำหรับการทำสิ่งที่พวกเขาทำ
เตอร์

@ isomorphismes - แก้ไขทุกส่วนที่คุณต้องการ
Digital Trauma

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