Saya ingin menghapus beberapa n baris dari akhir file. Bisakah ini dilakukan dengan menggunakan sed?
Misalnya, untuk menghapus garis dari 2 hingga 4, saya bisa menggunakan
$ sed '2,4d' file
Tapi saya tidak tahu nomor barisnya. Saya dapat menghapus baris terakhir menggunakan
$sed $d file
tapi saya ingin tahu cara menghapus n baris dari akhir. Tolong beri tahu saya cara melakukannya menggunakan sed atau metode lain.
sed
?sed $d file
mengembalikan kesalahan. Sebagai gantinya, $ d harus berada dalam tanda kutip, seperti ini:sed '$d' file
Jawaban:
Saya tidak tahu
sed
, tapi itu bisa dilakukan denganhead
:sumber
sed -e :a -e '$d;N;2,5ba' -e 'P;D' file
(,5
untuk 5 baris terakhir).head
, tetapi tidak standar. Memang, standar untukhead
negara:The application shall ensure that the number option-argument is a positive decimal integer.
head: illegal line count -- -2
Jika hardcoding n adalah opsi, Anda dapat menggunakan panggilan berurutan untuk melakukan sed. Misalnya, untuk menghapus tiga baris terakhir, hapus tiga baris terakhir tiga kali:
sumber
Dari sed one-liners :
Tampaknya apa yang Anda cari.
sumber
10
in'$d;N;2,10ba'
Solusi lucu & sederhana
sed
dantac
:CATATAN
"
diperlukan tanda kutip ganda untuk shell untuk mengevaluasi$n
variabel dalamsed
perintah. Dalam tanda kutip tunggal, tidak ada interpolasi akan dilakukan.tac
adalahcat
terbalik, lihatman 1 tac
{}
dised
yang ada untuk memisahkan$n
&d
(jika tidak, shell mencoba untuk interpolasi tidak ada$nd
variabel)sumber
tac
on osxport info coreutils
||brew info coreutils
;Gunakan
sed
, tetapi biarkan shell melakukan perhitungan, dengan tujuan untuk menggunakand
perintah dengan memberikan rentang (untuk menghapus 23 baris terakhir):Untuk menghapus 3 baris terakhir, dari dalam ke luar:
Memberi jumlah baris file: katakan 2196
Kami ingin menghapus 23 baris terakhir, jadi untuk sisi atau rentang kiri:
Memberikan: 2174 Jadi interpretasi asli setelah shell adalah:
Dengan
-i
melakukan inplace edit, file sekarang 2173 baris!Jika Anda ingin menyimpannya ke file baru, kodenya adalah:
sumber
Anda bisa menggunakan kepala untuk ini.
Menggunakan
$ head --lines=-N file > new_file
di mana N adalah jumlah baris yang ingin Anda hapus dari file.
Isi file asli minus baris N terakhir sekarang di new_file
sumber
Hanya untuk kelengkapan saya ingin menambahkan solusi saya. Saya akhirnya melakukan ini dengan standar
ed
:Ini menghapus 2 baris terakhir menggunakan pengeditan di tempat (meskipun tidak menggunakan file sementara di
/tmp
!!)sumber
Untuk memotong file yang sangat besar benar-benar di tempat kami memiliki
truncate
perintah. Tidak tahu tentang garis, tetapitail
+wc
dapat mengonversi garis menjadi byte:Ada kondisi ras yang jelas jika file tersebut ditulis pada waktu yang bersamaan. Dalam hal ini mungkin lebih baik untuk digunakan
head
- ia menghitung byte dari awal file (IO disk pikiran), jadi kami akan selalu memotong pada batas baris (mungkin lebih banyak baris dari yang diharapkan jika file secara aktif ditulis):Satu garis yang mudah digunakan jika Anda gagal mencoba memasukkan kata sandi sebagai ganti nama pengguna:
sumber
Ini mungkin bekerja untuk Anda (sed GNU):
sumber
'
).d
,D
atauP
dengan sed GNU dan bukan pada versi posix. Tampaknya baris tidak dicetak setelahD
dan tetap di buffer kerja untuk loop baru tanpa melewati ke 'akhir' baris tindakan.D
membuat efek sebaliknya.Sebagian besar jawaban di atas tampaknya membutuhkan perintah / ekstensi GNU:
Untuk solusi yang sedikit lebih mudah dibawa:
ATAU
ATAU
Di mana "10" adalah "n".
sumber
Dengan jawaban di sini Anda sudah belajar bahwa sed bukan alat terbaik untuk aplikasi ini.
Namun saya pikir ada cara untuk melakukan ini dalam menggunakan sed; idenya adalah menambahkan garis N untuk menahan ruang sampai Anda dapat membaca tanpa menekan EOF. Ketika EOF dipukul, cetak konten ruang tunggu dan keluar.
Perintah sed di atas akan menghilangkan 5 baris terakhir.
sumber
Coba perintah berikut:
sumber
=
.tail -r
mana yang orang lain gunakantac
untuk membalikkan urutan garis, dan membuatn
baris terakhir menjadin
baris pertama.Itu bisa dilakukan dalam 3 langkah:
a) Hitung jumlah baris dalam file yang ingin Anda edit:
b) Kurangi dari jumlah itu jumlah baris yang akan dihapus:
c) Katakan sed untuk menghapus dari nomor baris (
$x
) sampai akhir:sumber
sed
untuk menghapus baris 7 hingga 10, itu adalah 4 baris, bukan 3.Anda bisa mendapatkan jumlah total garis dengan
wc -l <file>
dan menggunakanhead -n <total lines - lines to remove> <file>
sumber
Ini akan menghapus 3 baris terakhir dari
file
:for i in $(seq 1 3); do sed -i '$d' file; done;
sumber
sed
.Saya lebih suka solusi ini;
di mana N adalah jumlah baris yang harus dihapus.
sumber
versi posix
sumber
Untuk menghapus 4 baris terakhir:
sumber
tac file | sed '1,4d' | tac
karena mengurutkan kemudian menghapus banyak biaya prefix dari sumber daya.tac
perintah adalah beberapa sistem (misalnya FreeBSD?)Saya datang dengan ini, di mana n adalah jumlah baris yang ingin Anda hapus:
Ini sedikit bundaran, tapi saya pikir mudah diikuti.
sumber
Untuk menghapus baris N terakhir file, Anda dapat menggunakan konsep yang sama
Anda dapat menggunakan kombo dengan perintah ekor untuk membalikkan file: jika N adalah 5
Dan cara ini juga berjalan di mana
head -n -5 file
perintah tidak berjalan (seperti pada mac!).sumber
Ini akan menghapus 12 baris terakhir
sumber