ส่วนที่ 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) และพบว่ามันใช้งานไม่ได้ในรูปแบบข้างต้น ปัญหาดูเหมือนจะเป็น:
;
ใช้เพื่อแยกบรรทัดโดยทั่วไปดูเหมือนว่าจะใช้งานได้ แต่ไม่ทำงานหลังจากติดป้ายกำกับ
- BSD sed ดูเหมือนจะต้องการ
;
หลังจากคำสั่งสุดท้ายใน{}
กลุ่มคำสั่งหนึ่งบรรทัดในขณะที่ GNU sed ไม่
\n
โดยทั่วไปสามารถใช้ภายในนิพจน์ปกติ แต่ดูเหมือนจะไม่อยู่ใน[]
นิพจน์วงเล็บเหลี่ยม ดังนั้นในการยกเว้นการขึ้นบรรทัดใหม่เราสามารถใช้สิ่งที่ต้องการ[[:alnum:][:punct:][:graph:][:blank:]]
แทนได้แม้ว่าสิ่งนี้อาจยกเว้นอักขระอื่น ๆ (โดยเฉพาะอักขระควบคุมอื่น ๆ )
ดังนั้นนี่คือความพยายามในเวอร์ชันที่เป็นอิสระของแพลตฟอร์ม:
sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'
ดูเหมือนว่าจะทำงานภายใต้ OSX และ Ubuntu
head
/ atail
solution ช้ากว่าsed
โซลูชันมาก ขอบคุณแม้ว่า