Saya ingin menghapus satu atau lebih nomor baris tertentu dari file. Bagaimana saya melakukan ini dengan menggunakan sed?
Saya ingin menghapus satu atau lebih nomor baris tertentu dari file. Bagaimana saya melakukan ini dengan menggunakan sed?
Jawaban:
Jika Anda ingin menghapus baris 5 hingga 10 dan 12:
sed -e '5,10d;12d' file
Ini akan mencetak hasilnya ke layar. Jika Anda ingin menyimpan hasil ke file yang sama:
sed -i.bak -e '5,10d;12d' file
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.
sed -e '5,$d' file
sed -e '5d' file
. Sintaksnya adalah <address><command>
; di mana <address>
bisa berupa baris tunggal suka 5
atau rentang garis seperti 5,10
, dan perintah d
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
sed -i '33d' file
Ini akan menghapus baris pada nomor 33 baris dan menyimpan file yang diperbarui.
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
. Terima kasih!
dan juga canggung
awk 'NR!~/^(5|10|25)$/' file
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
Ini sangat sering merupakan gejala antipattern. Alat yang menghasilkan nomor baris dapat diganti dengan yang menghapus garis segera. Sebagai contoh;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
(Di mana deletelines
utilitas yang Anda bayangkan Anda butuhkan) adalah sama dengan
grep -v error logfile
Karena 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 ini sed
.
sed 's%$%d%' linenumbers
Ini menerima file nomor baris, satu per baris, dan menghasilkan, pada output standar, nomor baris yang sama dengan d
ditambahkan setelah masing-masing. Ini adalah sed
skrip yang valid , yang dapat kita simpan ke file, atau (pada beberapa platform) pipa ke sed
contoh lain :
sed 's%$%d%' linenumbers | sed -f - logfile
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 untuk sed
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 ''
.
p
sebagai ganti d
, 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
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}'
OriginFile.dat > MyOutputCuttedFile.dat
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 penuhWhy ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
+1 We add again 1 because we want to restore the desired order.
+-----+------+----------+------------+
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 0 | 2 | 3 |
| 4 | 1 | 0 | 1 |
+-----+------+----------+------------+