Bagian 1
Cukup d
hapus baris ke-13:
sed '13d' <file.txt
Dan cara umum untuk melakukan pelengkap di atas adalah:
sed '13!d' <file.txt
Bagian 2
Karena itu bisa dilakukan:
sed -n ':a;${P;q};N;4,$D;ba' <file.txt
Perhatikan 4
ini satu lebih dari jumlah yang Anda butuhkan. Jadi jika Anda menginginkan baris ke-10 terakhir, ini akan menjadi 11
.
Pengujian dengan seq
:
$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$
Mencoba penjelasan
: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
Tambahan berharga Glenn Jackman:
Itu "hanya baris ke-N". Ini adalah "all BUT the Nth line":
sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'
bekerja dengan sed GNU, \n
urutannya mungkin tidak bekerja dengan sed lainnya.
Saya mencoba ini dengan BSD sed (OSX) dan ternyata tidak cukup berfungsi pada formulir di atas. Masalahnya tampaknya:
;
digunakan untuk memisahkan garis yang umumnya berfungsi, tetapi tidak bekerja setelah label
- BSD sed tampaknya membutuhkan
;
setelah perintah terakhir dalam {}
grup perintah satu baris , sedangkan GNU sed tidak
\n
secara umum dapat digunakan dalam ekspresi reguler, tetapi tampaknya tidak dalam []
ekspresi braket. Jadi untuk mengecualikan baris baru, kita dapat menggunakan sesuatu seperti [[:alnum:][:punct:][:graph:][:blank:]]
, meskipun ini dapat mengecualikan karakter lain (khususnya karakter kontrol lainnya).
Jadi ini adalah upaya untuk versi yang lebih independen dari platform:
sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'
Tampaknya ini berfungsi di bawah OSX dan Ubuntu.
head
/tail
solusi jauh lebih lambat daripadased
solusi. Terimakasih Meskipun.head
/tail
) dioptimalkan untuk melakukan apa yang mereka lakukan.