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 wc
dan beberapa trik lainnya).
Saat ini, menggunakan solusi dengan head
dan tail
dikombinasikan dengan wc
untuk melakukannya. Adakah tikungan cepat di sini?
text-processing
sed
mtk
sumber
sumber
head
dantail
...head
dantail
tahu tentang rasa yang berbeda?Jawaban:
sed
$
adalah baris terakhir sehingga untuk menghapus baris terakhir:sumber
sed -i '$d' <file>
untuk mengedit file dalam tempat.$ untuk baris terakhir:
sumber
sed '$d' file; sed '$d' file
sed '$d' file
sebenarnya tidak memodifikasi file; itu hanya mencetak isi file, minus baris terakhir. Jadised '$d' file; sed '$d' file
akan mencetak isi file dua kali , minus baris terakhir setiap kali. Setara delete-the-last-two-linessed '$d' file
adalahsed '$d' file | sed '$d'
.sed -n '1{h;n;}; $q; x; p;'
. Aku mencibir bahwa kita tidak bisa begitu saja melakukannyased '$-1,$d'
.cat file.txt | head -n -1 > new_file.txt
Waspadalah, tampaknya, tergantung pada baris terakhir
file.txt
(jika diakhiri denganEOF
, atau\n
kemudianEOF
), jumlah baris dalamnew_file.txt
mungkin sama (sepertifile.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.
sumber
head -n -1 file.txt > new_file.txt
. Perhatikan bahwa penghitungan negatifhead -n
hanya tersedia untuk beberapa implementasihead
. Misalnya, ini tidak berfungsi untuk FreeBSD atau untuk versi BusyBoxhead
.head -n -1 file.txt > new_file.txt
lebih 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.)head --lines=-1
. Saya pertama kali menemukan kemungkinan ini di halaman manual untuk head pada sistem SLES11SP2 (coreutils-8.12-6.23.1)tail
danhead
merupakan bagian daricoreutils
-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.1Saya tidak yakin apakah RH5.5. sudah memiliki versi coreutils yang mendukungnya. Tapi 5.5 sudah EoLed.
sumber
Linux
$ adalah baris terakhir, d untuk menghapus:
MacOS
Setara dengan sed -i
sumber