sed adalah editor aliran (stream editor), yaitu perkakas yang membaca teks baris demi baris, menerapkan satu atau beberapa perintah penyuntingan pada tiap baris, lalu mencetak hasilnya. Pekerjaan yang paling sering dilakukan sed adalah substitusi teks dan penyuntingan langsung di tempat. Topik ini membahas perintah substitusi s, tanda g, pembatas alternatif, penghapusan baris, serta opsi -i beserta bentuk cadangannya.
Substitusi dengan perintah s#
Bentuk perintah substitusi adalah s/pola/pengganti/: sed mencari pola pada setiap baris masukan, lalu mengganti kecocokannya dengan teks pengganti. Sebagai contoh, berkas jadwal.txt berisi rencana kerja mingguan yang memuat kata rapat berulang kali. Contoh berikut mengganti rapat menjadi undangan dan menampilkan hasilnya ke layar.
# menyiapkan folder kerja dan berkas contoh
mkdir -p /tmp/kerja-sed
cd /tmp/kerja-sed
printf 'Senin: rapat mingguan, lanjut rapat teknis\nSelasa: tulis laporan\nRabu: tinjau kode\nKamis: tulis laporan\nJumat: rapat dengan pembimbing\n' > jadwal.txt
cat jadwal.txtSenin: rapat mingguan, lanjut rapat teknis
Selasa: tulis laporan
Rabu: tinjau kode
Kamis: tulis laporan
Jumat: rapat dengan pembimbingcd /tmp/kerja-sed
# mengganti kemunculan pertama pada setiap baris
sed 's/rapat/undangan/' jadwal.txtSenin: undangan mingguan, lanjut rapat teknis
Selasa: tulis laporan
Rabu: tinjau kode
Kamis: tulis laporan
Jumat: undangan dengan pembimbingPerhatikan baris pertama. Hanya rapat yang pertama yang berubah, sedangkan rapat teknis tetap, karena tanpa tanda tambahan sed mengganti satu kecocokan per baris. Perhatikan pula bahwa berkas jadwal.txt tidak berubah: tanpa opsi tertentu, sed hanya mencetak hasil penyuntingannya ke stdout, sehingga eksperimen dengan sed aman dilakukan berulang kali.
Flag g untuk semua kemunculan#
Tanda tambahan (flag) memodifikasi cara perintah sed bekerja. Tanda g (global) ditulis setelah pemisah terakhir, menjadi s/pola/pengganti/g, dan memerintahkan sed mengganti semua kecocokan pada setiap baris, bukan hanya yang pertama.
cd /tmp/kerja-sed
# mengganti semua kemunculan pada setiap baris
sed 's/rapat/undangan/g' jadwal.txtSenin: undangan mingguan, lanjut undangan teknis
Selasa: tulis laporan
Rabu: tinjau kode
Kamis: tulis laporan
Jumat: undangan dengan pembimbingBaris pertama kini berubah lengkap. Pemilihan bentuk dengan atau tanpa g bergantung pada maksud: tanpa g untuk mengganti satu istilah per baris, dengan g untuk membersihkan satu kata dari seluruh teks. GNU sed juga menerima angka pada posisi tanda tambahan, misalnya s/rapat/undangan/2 yang mengganti kemunculan kedua pada setiap baris.
cd /tmp/kerja-sed
# mengganti hanya kemunculan kedua pada setiap baris
sed 's/rapat/undangan/2' jadwal.txtSenin: rapat mingguan, lanjut undangan teknis
Selasa: tulis laporan
Rabu: tinjau kode
Kamis: tulis laporan
Jumat: rapat dengan pembimbingBaris Senin menyisakan rapat pertama dan mengganti rapat teknis, sedangkan baris Jumat tetap utuh karena hanya memuat satu kemunculan. Kontrol selektif seperti ini membuat substitusi sed dapat diarahkan tanpa menyentuh bagian lain dari baris.
Pembatas alternatif#
Pola dan pengganti sering memuat tanda garis miring, misalnya jalur direktori seperti /home/kal. Menulis / di dalam pola memaksa setiap garis miring ditulis dengan tanda garis miring terbalik di depannya, sehingga perintah menjadi sulit dibaca. Untuk itu sed menyediakan pembatas alternatif: karakter apa pun yang ditulis setelah s menjadi pemisah. Contoh berikut memakai | untuk mengganti awalan jalur pada berkas konfigurasi.
cd /tmp/kerja-sed
# menyiapkan berkas konfigurasi kecil
printf 'root_dir=/home/kal/data\nbackup_dir=/home/kal/cadangan\n' > jalur.conf
# tanda | dipakai sebagai pembatas karena polanya memuat /
sed 's|/home/kal|/media/disk|' jalur.confroot_dir=/media/disk/data
backup_dir=/media/disk/cadanganBentuk yang sama dapat memakai #, ,, atau karakter lain yang tidak muncul pada pola, misalnya s#/home/kal#/media/disk#. Pembatas alternatif berlaku pula pada substitusi yang disertai tanda tambahan seperti g, sehingga bentuknya menjadi s|pola|pengganti|g. Syaratnya hanya satu: karakter yang dipilih tidak boleh muncul pada pola maupun penggantinya. Konsistensi pemilihannya menjaga perintah tetap mudah dibaca pada berkas panjang.
Menghapus baris dengan d#
Perintah d menghapus baris yang sedang diproses sehingga tidak tercetak. Bentuk yang sering dipakai adalah /pola/d, yang menghapus setiap baris yang cocok dengan pola. Contoh berikut membuang baris Rabu dari tampilan jadwal.
cd /tmp/kerja-sed
# membuang baris yang memuat Rabu dari keluaran
sed '/Rabu/d' jadwal.txtSenin: rapat mingguan, lanjut rapat teknis
Selasa: tulis laporan
Kamis: tulis laporan
Jumat: rapat dengan pembimbingPerintah d juga menerima nomor baris, sehingga 3d membuang baris ketiga tanpa memandang isinya. Rentang alamat seperti /Rabu/,/Kamis/d membuang semua baris dari kecocokan Rabu sampai kecocokan Kamis. Hasil penghapusan hanya berlaku pada keluaran, sedangkan berkas aslinya tetap utuh. Untuk membuang baris secara permanen, penghapusan ini perlu dipadukan dengan opsi -i yang dibahas pada bagian berikutnya.
Penyuntingan langsung di tempat dengan -i#
Opsi -i (in-place, langsung di tempat) mengubah perilaku sed: hasil penyuntingan tidak dicetak ke layar, melainkan ditulis kembali ke berkas aslinya. Opsi inilah yang menjadikan sed alat penyuntingan berkas yang lengkap di baris perintah. Contoh berikut mengganti tulis laporan menjadi susun laporan secara permanen.
cd /tmp/kerja-sed
# memuat ulang berkas contoh agar hasilnya dapat diulang
printf 'Senin: rapat mingguan, lanjut rapat teknis\nSelasa: tulis laporan\nRabu: tinjau kode\nKamis: tulis laporan\nJumat: rapat dengan pembimbing\n' > jadwal.txt
# menyunting berkas langsung di tempat
sed -i 's/tulis laporan/susun laporan/g' jadwal.txt
cat jadwal.txtSenin: rapat mingguan, lanjut rapat teknis
Selasa: susun laporan
Rabu: tinjau kode
Kamis: susun laporan
Jumat: rapat dengan pembimbingGNU sed menyediakan bentuk -i.bak, yaitu -i yang disertai akhiran cadangan. Dengan bentuk ini, sed menyimpan salinan berkas asli sebelum menyunting, dan salinan itu diberi nama berkas asli ditambah akhiran tersebut.
cd /tmp/kerja-sed
# memuat ulang berkas contoh sekali lagi
printf 'Senin: rapat mingguan, lanjut rapat teknis\nSelasa: tulis laporan\nRabu: tinjau kode\nKamis: tulis laporan\nJumat: rapat dengan pembimbing\n' > jadwal.txt
# menyunting di tempat dengan salinan cadangan
sed -i.bak 's/rapat/undangan/g' jadwal.txt
# membandingkan cadangan dengan hasil suntingan
diff jadwal.txt.bak jadwal.txt1c1
< Senin: rapat mingguan, lanjut rapat teknis
---
> Senin: undangan mingguan, lanjut undangan teknis
5c5
< Jumat: rapat dengan pembimbing
---
> Jumat: undangan dengan pembimbingBerkas jadwal.txt.bak kini berisi isi asli, sedangkan jadwal.txt berisi hasil suntingan, dan diff menampilkan baris yang berubah di antara keduanya. Opsi -i juga dapat diterapkan pada banyak berkas sekaligus melalui pola shell, misalnya sed -i 's/lama/baru/g' *.conf, sehingga perubahan yang sama diterapkan seragam pada seluruh berkas konfigurasi dalam satu perintah.
Kesalahan umum#
Kesalahan pertama adalah lupa tanda g ketika sebuah kata muncul beberapa kali dalam satu baris. Hasilnya hanya kemunculan pertama yang berganti, sementara sisanya lolos tanpa perubahan. Kesalahan kedua adalah menjalankan -i pada berkas penting tanpa cadangan. Membuat salinan berupa berkas.bak atau menyalin berkas dengan cp terasa merepotkan, tetapi menyelamatkan pekerjaan apabila pola yang ditulis ternyata keliru.
Kesalahan ketiga adalah menulis skrip sed tanpa tanda kutip. Skrip s/rapat/undangan/g memuat karakter yang diberi makna khusus oleh shell, sehingga bentuk kutip tunggal 's/rapat/undangan/g' menjadi kebiasaan yang aman. Kesalahan keempat adalah menganggap sed selalu mengubah berkas. Tanpa -i, sed tidak pernah menyentuh berkas aslinya, dan keluarannya hanya berupa teks yang tercetak, sehingga pengujian pertama tidak berisiko.
Ringkasan#
- sed membaca teks baris demi baris, menerapkan perintah penyuntingan, lalu mencetak hasilnya ke stdout tanpa mengubah berkas aslinya.
- Perintah
s/pola/pengganti/mengganti satu kecocokan per baris, sedangkan tandagmengganti semua kecocokan, dan karakter setelahsdapat dipakai sebagai pembatas alternatif. - Perintah
/pola/dmembuang baris yang cocok dari keluaran, sedangkan opsi-imenulis hasil suntingan ke berkas asli dan-i.bakmembuat salinan cadangan terlebih dahulu. - Pengujian tanpa
-ilebih dahulu adalah kebiasaan yang mencegah berkas penting rusak tanpa dapat dibatalkan.
Referensi#
- GNU sed Manual — GNU Project — Dokumentasi resmi GNU sed mengenai perintah substitusi, flag, dan penyuntingan langsung di tempat.