Bölüm 1
d
13. hattı seçmeniz yeterlidir :
sed '13d' <file.txt
Yukarıdakilerin tamamlayıcılığını yapmanın genel bir yolu:
sed '13!d' <file.txt
Bölüm 2
Çünkü yapılabilir:
sed -n ':a;${P;q};N;4,$D;ba' <file.txt
Bunun 4
, ihtiyaç duyduğunuz sayıdan daha fazla olduğunu unutmayın . Son 10 satırını isteseydiniz, bu olurdu 11
.
Şununla test seq
:
$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$
Açıklama denendi
: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 değerli eklentisi:
"Sadece N'inci sıra" idi. İşte "hepsi A N. Satır":
sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'
GNU sed ile çalışır, \n
sıra diğer seds ile çalışmayabilir.
Ben BSD sed (OSX) ile denedim ve yukarıdaki formda oldukça işe yaramadı bulundu. Sorunlar şu şekilde görünüyor:
;
satırları ayırmak için kullanılan genellikle işe yarıyor gibi görünüyor, ancak bir etiketten sonra çalışmıyor
;
Tek satırlı {}
komut grubundaki son komuttan sonra BSD sed gerektiriyor gibi görünürken GNU sed
\n
genellikle normal ifade içinde kullanılabilir, ancak görünüşe göre bir []
parantez ifadesi içinde kullanılamaz. Dolayısıyla, yeni satırları hariç tutmak için [[:alnum:][:punct:][:graph:][:blank:]]
bunun yerine başka bir şey kullanabiliriz , ancak bu diğer karakterleri (özellikle diğer kontrol karakterlerini) hariç tutabilir.
Bu daha platformdan bağımsız bir versiyona yönelik bir girişimdir:
sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'
Bu OSX ve Ubuntu altında çalışıyor gibi görünüyor.
head
/tail
çözümün birsed
çözümden çok daha yavaş olduğunu göstermektedir . Yine de teşekkürler.