Hapus baris terakhir dari file

44

Saya gunakan sed untuk menghapus baris dengan posisi tertentu dengan cepat

sed '1d'
sed '5d'

Tapi, bagaimana jika saya ingin menghapus baris terakhir file dan saya tidak tahu jumlah baris (saya tahu saya bisa menggunakan itu wcdan beberapa trik lainnya).

Saat ini, menggunakan solusi dengan headdan taildikombinasikan dengan wcuntuk melakukannya. Adakah tikungan cepat di sini?

mtk
sumber
Os yang mana? Beberapa rasa memiliki pilihan menarik untuk headdan tail...
Nils
@Nils Saya di 'Red Hat Enterprise Linux Server rilis 5.5 (Tikanga)'. Bisakah Anda menunjukkan opsi headdan tailtahu tentang rasa yang berbeda?
mtk
Aku melakukannya. Lihat di bawah.
Nils

Jawaban:

88

sed $adalah baris terakhir sehingga untuk menghapus baris terakhir:

sed '$d' <file>
h3rrmiller
sumber
12
Gunakan sed -i '$d' <file>untuk mengedit file dalam tempat.
WanderingMind
1
Apa yang akan dihapus n baris terakhir, di mana n adalah bilangan bulat?
Joshua Salazar
31

$ untuk baris terakhir:

sed '$d' file
Guru
sumber
10
mengalahkan Anda 30 detik: P
h3rrmiller
1
Sayangnya, kita harus menggunakan teknik yang lebih kompleks untuk menghapus, katakanlah, dua baris terakhir.
dubiousjim
Apa maksudmu? sed '$d' file; sed '$d' file
Rob
3
@Rob: sed '$d' filesebenarnya tidak memodifikasi file; itu hanya mencetak isi file, minus baris terakhir. Jadi sed '$d' file; sed '$d' fileakan mencetak isi file dua kali , minus baris terakhir setiap kali. Setara delete-the-last-two-lines sed '$d' fileadalah sed '$d' file | sed '$d'.
ruakh
2
Ya, itu tidak bagus tapi tentu saja berhasil. Saya akan melakukannya sekali jalan sed -n '1{h;n;}; $q; x; p;'. Aku mencibir bahwa kita tidak bisa begitu saja melakukannya sed '$-1,$d'.
dubiousjim
14

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

Waspadalah, tampaknya, tergantung pada baris terakhir file.txt(jika diakhiri dengan EOF, atau \nkemudian EOF), jumlah baris dalam new_file.txtmungkin sama (seperti file.txt) setelah perintah ini (ini terjadi ketika tidak ada \n) - dalam hal apa pun, isi dari baris terakhir dihapus.

Juga, perhatikan bahwa Anda harus menggunakan file kedua (menengah). Jika Anda menggambar dan mengalihkan ke file yang sama, Anda akan menghapusnya.

Emanuel Berg
sumber
6
Di mana ini bekerja, bisa juga sederhana head -n -1 file.txt > new_file.txt. Perhatikan bahwa penghitungan negatif head -nhanya tersedia untuk beberapa implementasi head. Misalnya, ini tidak berfungsi untuk FreeBSD atau untuk versi BusyBox head.
dubiousjim
1
@dubiousjim: Setuju, head -n -1 file.txt > new_file.txtlebih baik. Ini bekerja dengan cara yang sama sehubungan dengan dua komentar saya (jumlah baris yang sama, dan, hapus pada file yang sama). Adapun argumen negatif, perbedaan seperti itu terjadi dari waktu ke waktu antara Unix, dan mereka sering membuat frustasi karena Anda berharap itu menjadi perintah yang sama sekali (dan mengapa Anda tidak - nama dan tujuan yang sama!) - Bagaimanapun, bagus titik. (Saya menggunakan Debian.)
Emanuel Berg
5

head --lines=-1. Saya pertama kali menemukan kemungkinan ini di halaman manual untuk head pada sistem SLES11SP2 (coreutils-8.12-6.23.1)

taildan headmerupakan bagian dari coreutils-rpm (setidaknya untuk sistem berbasis rpm).

Menurut changelog dari coreutils, sintaks ini didukung sejak coreutils-versi 5.0.1

Berita buruk: Menurut halaman man RH5 opsi ini tidak dijelaskan

Berita baik: Ini bekerja dengan RH5 (jadi dalam kasus Anda: ini berfungsi - setidaknya dengan versi RH5 saat ini).

rpm -q coreutils menunjukkan kepada saya (pada CentOS 5.8): coreutils-5.97-34.el5_8.1

Saya tidak yakin apakah RH5.5. sudah memiliki versi coreutils yang mendukungnya. Tapi 5.5 sudah EoLed.

Nils
sumber
+1. ini bekerja dengan baik di RH5.5. Terima kasih.
mtk
0

Linux

$ adalah baris terakhir, d untuk menghapus:

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

MacOS

Setara dengan sed -i

sed -i '' -e '$ d' ~/path/to/your/file/name
jasonleonhard
sumber