Saya ingin menghapus satu atau lebih nomor baris tertentu dari file. Bagaimana saya melakukan ini dengan menggunakan sed?
unix
sed
line-numbers
Justin Ethier
sumber
sumber
Jawaban:
Jika Anda ingin menghapus baris 5 hingga 10 dan 12:
Ini akan mencetak hasilnya ke layar. Jika Anda ingin menyimpan hasil ke file yang sama:
Ini akan mendukung file hingga
file.bak
, dan menghapus baris yang diberikan.Catatan: Nomor baris dimulai dari 1. Baris pertama file adalah 1, bukan 0.
sumber
sed -e '5,$d' file
sed -e '5d' file
. Sintaksnya adalah<address><command>
; di mana<address>
bisa berupa baris tunggal suka5
atau rentang garis seperti5,10
, dan perintahd
menghapus baris atau garis yang diberikan. Alamat juga bisa berupa ekspresi reguler, atau tanda dolar yang$
menunjukkan baris terakhir file.Anda dapat menghapus satu baris tertentu dengan nomor barisnya dengan
Ini akan menghapus baris pada nomor 33 baris dan menyimpan file yang diperbarui.
sumber
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
. Terima kasih!dan juga canggung
sumber
sumber
Ini sangat sering merupakan gejala antipattern. Alat yang menghasilkan nomor baris dapat diganti dengan yang menghapus garis segera. Sebagai contoh;
(Di mana
deletelines
utilitas yang Anda bayangkan Anda butuhkan) adalah sama denganKarena itu, jika Anda berada dalam situasi di mana Anda benar-benar perlu melakukan tugas ini, Anda dapat menghasilkan
sed
skrip sederhana dari file nomor baris. Dengan lucu (tapi mungkin sedikit membingungkan) Anda dapat melakukan inised
.Ini menerima file nomor baris, satu per baris, dan menghasilkan, pada output standar, nomor baris yang sama dengan
d
ditambahkan setelah masing-masing. Ini adalahsed
skrip yang valid , yang dapat kita simpan ke file, atau (pada beberapa platform) pipa kesed
contoh lain :Pada beberapa platform,
sed -f
tidak memahami argumen opsi-
berarti input standar, jadi Anda harus mengarahkan ulang skrip ke file sementara, dan membersihkannya ketika Anda selesai, atau mungkin mengganti dasbor tunggal dengan/dev/stdin
atau/proc/$pid/fd/1
jika OS Anda (atau shell ) memiliki itu.Seperti biasa, Anda dapat menambahkan
-i
sebelum-f
opsi untuksed
mengedit file target, alih-alih menghasilkan hasilnya pada output standar. Pada platform * BSDish (termasuk OSX) Anda juga perlu memberikan argumen eksplisit-i
; idiom yang umum adalah memberikan argumen kosong;-i ''
.sumber
p
sebagai gantid
, bersama dengan opsi-n
(itu tidak akan berfungsi tanpa-n
, dan!d
tidak akan berfungsi baik).Saya ingin mengusulkan generalisasi dengan awk.
Ketika file dibuat dengan blok dengan ukuran tetap dan baris yang akan dihapus diulang untuk setiap blok, awk dapat berfungsi dengan baik sedemikian rupa
Dalam contoh ini ukuran untuk blok adalah 2000 dan saya ingin mencetak garis [1..713] dan [1026..1029].
NR
adalah variabel yang digunakan oleh awk untuk menyimpan nomor baris saat ini.%
memberikan sisa (atau modulus) pembagian dua bilangan bulat;nl=((NR-1)%BLOCKSIZE)+1
Di sini kita menulis dalam variabel nl nomor baris di dalam blok saat ini. (Lihat di bawah)||
dan&&
operator logis OR dan DAN .print $0
menulis baris penuhsumber