Saya memiliki dua file teks:file1
dan file2
, keduanya dengan beberapa baris.
$ cat file1
line one
line two
line three
line four
line five
$ cat file2
line A
line B
line C
line D
line E
line F
Saya ingin mengganti rentang dari baris file1
(dari baris 1_start
ke baris 1_end
) dengan rentang dari baris file2
(dari baris 2_start
ke baris 2_end
).
Misalnya, gantikan baris 2,4
di file1
dengan garis 3,5
dari file2
.
Yang hanya bisa saya lakukan sampai sekarang adalah mengekstrak baris yang diperlukan dari file2
dengan
$ sed -n 3,5p file2
Tapi itu tidak membantu memasukkannya ke file1
. Apakah mungkin dengan sed
? Jika tidak, apakah mungkin dengan alat serupa?
Jawaban yang Diterima:
sed
dapat mencetak rentang garis tertentu dengan sesuatu seperti ini:
sed -n 'X,Yp' filename
Dimana X
adalah baris pertama dalam rentang dan Y
adalah baris terakhir, keduanya inklusif. -n
memberitahu sed
untuk tidak mencetak apa pun kecuali secara eksplisit diperintahkan untuk melakukannya dan itulah yang p
mengikuti kisarannya.
Jadi Anda dapat dengan mudah memanggil ini tiga kali, menambahkan ke file sementara, lalu memindahkan file itu ke mana pun Anda inginkan. Anda juga dapat menggabungkan semuanya menggunakan cat
dan proses substitusi seperti yang ditunjukkan oleh contoh ini (saya menggunakan nomor baris yang baru saja saya keluarkan; $
adalah baris terakhir dalam file):
cat <(sed -n '1,5p' file1) <(sed -n '10,12p' file2) <(sed -n '9,$p' file1) > file1.tmp && mv file1.tmp file1
Di sini, kita akan mengganti baris 6, 7 dan 8 di file1
dengan baris 10, 11 dan 12 dari file2
.
Pembaruan: Terima kasih kepada @MiniMax karena telah menunjukkan bahwa cat
dan proses substitusi dapat dihindari dengan melakukan hal berikut:
{ sed -n '1,5p' file1; sed -n '10,12p' file2; sed -n '9,$p' file1; } > file1.tmp && mv file1.tmp file1
Ciuman, setelah semua.