Dosyadan son satırı sil


44

sed Gibi belirli bir konuma sahip satırları hızlı bir şekilde silmek için kullanın

sed '1d'
sed '5d'

Ancak, dosyanın son satırını silmek istersem ve satır sayısını bilmezsem (bunu kullanarak wcve birkaç başka numara kullanabileceğimi biliyorum ).

Şu anda, ile bir geçici çözüm kullanarak headve bunun için tailbirlikte wc. Burada hızlı bükülme var mı?


Hangi os? Bazı tatlar için ilginç seçenekler var headve tail...
Nils

@Nils 'Red Hat Enterprise Linux Server 5.5 sürümü (Tikanga)' üzerindeyim. Farklı lezzetler hakkında seçenekleri headve tailbunları biliyor musunuz?
mtk

Yaptım. Aşağıya bakınız.
Nils

Yanıtlar:


87

sed $içinde son satırdır, yani son satırı silmek için:

sed '$d' <file>

12
sed -i '$d' <file>Dosyayı yerinde düzenlemek için kullanın .
WanderingMind

1
N'nin herhangi bir tamsayı numarası olduğu son n satırını silmek için ne olur?
Joshua Salazar

31

Son satır için $:

sed '$d' file

9
30 saniyede seni yenmek: P
h3rrmiller

1
Ne yazık ki son iki satırın silinmesi için daha karmaşık teknikler kullanılması gerektiğine rağmen.
dubiousjim

Ne demek istiyorsun? sed '$d' file; sed '$d' file
Rob

3
@Rob: sed '$d' fileaslında dosyayı değiştirmez; sadece dosyanın içeriğini, son satırı eksi olarak yazdırır. Böylece sed '$d' file; sed '$d' file, dosyanın içeriğini iki kez , her seferinde son satırı eksi olarak yazdıracaksınız . Silme-son-iki-hatları eşdeğer sed '$d' fileolduğunu sed '$d' file | sed '$d'.
48'te

2
Evet, bu tuhaf ama elbette işe yarıyor. Tek geçişte yapardım sed -n '1{h;n;}; $q; x; p;'. Yapamayacağımızı sanıyordum sed '$-1,$d'.
dubiousjim

14

cat file.txt | head -n -1 > new_file.txt

Dikkat, bu son satırına bağlı olarak görünüyor file.txt(Bu ile biterse EOF, ya \nsonra ve EOF, satır sayısı) new_file.txtaynı (aynı olabilir file.txt(bu hiç yokken olur bu komutun ardından) \n) - her durumda, Son satırın içeriği silinir.

Ayrıca, ikinci bir (ara) dosya kullanmanız gerektiğini unutmayın. Kedi ve aynı dosyaya yönlendirirseniz, onu sileceksiniz.


6
Bunun çalıştığı yerde de basit olabilir head -n -1 file.txt > new_file.txt. Bununla birlikte, negatif sayımların head -nyalnızca bazı uygulamalar için geçerli olduğunu unutmayın head. Örneğin, FreeBSD'ler veya BusyBox sürümleri için çalışmaz head.
dubiousjim

1
@dubiousjim: Kabul, head -n -1 file.txt > new_file.txtdaha iyidir. Benim iki yorumumda da aynı şekilde çalışıyor (aynı satırda ve aynı dosyayı sil). Olumsuz argümana gelince, bu tür farklılıklar zaman zaman Unix'ler arasında ortaya çıkar ve çoğu zaman sinir bozucu olur çünkü tamamen aynı komut olmasını beklersiniz (ve neden olmasın - aynı isim ve amaç!) - her neyse, iyi puan. (Debian'ı kullanıyorum.)
Emanuel Berg

5

head --lines=-1. Önce bu olasılıkla SLES11SP2-sistemindeki kafa için man-sayfasındaki tökezledi (coreutils-8.12-6.23.1)

tailve -rpm'nin bir headparçasıdır coreutils(en azından rpm-tabanlı sistemler için).

Coreutils'in değişmezliğine göre, bu sözdizimi coreutils-version 5.0.1'ten beri desteklenmektedir.

Kötü haber: RH5-man sayfasına göre bu seçenek tanımlanmıyor

İyi haber: RH5 ile çalışır (yani sizin durumunuz: çalışır - en azından RH5'in güncel bir versiyonuyla).

rpm -q coreutils bana gösterir (CentOS 5.8’de): coreutils-5.97-34.el5_8.1

RH5.5 olup olmadığından emin değilim. Zaten onu destekleyen coreutils sürümüne sahip. Ancak 5.5 zaten EoLed.


+1. Bu mükemmel bir RH5.5 üzerinde çalışıyor. Teşekkürler.
mtk

0

Linux

$, son satırdır, d silmek için:

sed '$d' ~/path/to/your/file/name

Mac os işletim sistemi

Sed -i eşdeğeri

sed -i '' -e '$ d' ~/path/to/your/file/name
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.