grep menemukan baris yang kita cari; sed mengubah baris itu. Nama sed singkatan dari stream editor: perintah ini membaca input baris demi baris, menerapkan daftar perintah suntingan pada setiap baris, lalu mencetak hasilnya ke stdout. File asli tidak pernah tersentuh — kecuali kita sengaja memakai opsi -i. Pada chapter ini kita akan berlatih substitusi s///, delimiter alternatif untuk pola bergaris miring, pencetakan selektif, penghapusan baris, transliterasi karakter, dan terakhir penyuntingan langsung pada file.

Substitusi Dasar dengan s/// #

Perintah paling sering dipakai di sed adalah s/pola/pengganti/: ganti kemunculan pertama pola pada setiap baris dengan teks pengganti. Menambahkan flag g (global) mengganti semua kemunculan pada baris yang sama:

bash
printf 'kaos merah, topi merah\nsepatu hitam\n' > barang.txt
sed 's/merah/biru/' barang.txt
sed 's/merah/biru/g' barang.txt
cat barang.txt

Output yang Dihasilkan:

text
kaos biru, topi merah
sepatu hitam
kaos biru, topi biru
sepatu hitam
kaos merah, topi merah
sepatu hitam

Mari kita bedah baris per barisnya:

  1. Baris 1 (printf ... > barang.txt): membuat fixture dua baris; baris pertama sengaja memuat kata merah dua kali.
  2. Baris 2 (sed 's/merah/biru/'): hanya kemunculan pertama yang berubah — hasilnya kaos biru, topi merah, topi merah masih merah.
  3. Baris 3 (sed 's/merah/biru/g'): flag g mengganti setiap kemunculan dalam baris yang sama, sehingga kaos dan topi keduanya jadi biru.
  4. Baris 4 (cat barang.txt): membuktikan file asli tidak berubah — sed bekerja pada aliran stdout, bukan pada file.

Delimiter Lain untuk Pola Bergaris Miring #

Garis miring / adalah pemisah (delimiter) bawaan perintah s. Masalah muncul ketika pola atau teks pengganti sendiri memuat /, misalnya path direktori, karena sed akan salah membaca batas pola. Solusinya sederhana: karakter apa pun setelah s bisa menjadi delimiter — | dan # adalah favorit:

bash
printf 'arsip tersimpan di /home/budi/dokumen\n' > catatan.txt
sed 's|/home/budi/dokumen|/home/budi/arsip|' catatan.txt
printf 'pesanan #1234 sudah dikirim\n' > nota.txt
sed -E 's/[0-9]+/[nomor]/' nota.txt

Output yang Dihasilkan:

text
arsip tersimpan di /home/budi/arsip
pesanan #[nomor] sudah dikirim

Baris kedua memakai | sebagai delimiter, sehingga path yang penuh garis miring terbaca utuh tanpa perlu escape \/. Baris keempat memakai opsi -E untuk extended regular expression: pola [0-9]+ berarti “satu atau lebih digit” dan cocok dengan 1234, lalu seluruh temuan diganti teks [nomor]. Pembahasan sintaks regex lengkap ada di chapter Regular Expressions .

Mencetak Selektif dan Menghapus Baris #

Perintah p mencetak baris dan perintah d menghapusnya dari aliran keluaran. Kombinasi yang sering dipakai: -n mematikan pencetakan otomatis, lalu p memilih yang ingin ditampilkan — pasangan ini menjadi “filter cetak”:

bash
printf '# konfigurasi utama\nport=8080\nhost=localhost\n# catatan internal\nnilai=42\n' > app.conf
sed -n '1,2p' app.conf
sed -n '/^port/p' app.conf
sed '/^#/d' app.conf
sed '2d' app.conf
printf 'kode: abc\n' > kode.txt
sed 'y/abc/xyz/' kode.txt

Output yang Dihasilkan:

text
# konfigurasi utama
port=8080
port=8080
port=8080
host=localhost
nilai=42
# konfigurasi utama
host=localhost
# catatan internal
nilai=42
kode: xyz

Perintah sed -n '1,2p' mencetak rentang baris 1 sampai 2, sedangkan sed -n '/^port/p' hanya mencetak baris yang diawali teks port. Perintah sed '/^#/d' membuang semua baris komentar yang diawali # — resep andalan untuk membersihkan file konfigurasi. Perintah sed '2d' menghapus berdasarkan nomor baris: baris kedua (port=8080) lenyap. Terakhir, y/abc/xyz/ mentransliterasi karakter: setiap a jadi x, b jadi y, c jadi z — penggantian per karakter, bukan per kata seperti s///.

Menyunting File Langsung dengan -i #

Semua contoh sejauh ini hanya menulis ke stdout. Opsi -i (in-place) membelokkan hasil suntingan kembali ke file asli, dan sufiks seperti .bak sekaligus menyimpan salinan lama:

bash
printf 'port=8080\nhost=localhost\n' > app.conf
sed -i.bak 's/port=8080/port=9090/' app.conf
cat app.conf
cat app.conf.bak

Output yang Dihasilkan:

text
port=9090
host=localhost
port=8080
host=localhost

Mari kita bedah baris per barisnya:

  1. Baris 1: membuat app.conf berisi dua baris konfigurasi.
  2. Baris 2 (sed -i.bak ...): mengganti port=8080 menjadi port=9090 dan menulis hasilnya kembali ke app.conf; salinan isi lama tersimpan di app.conf.bak.
  3. Baris 3 (cat app.conf): membuktikan file utama sudah tersunting — port kini 9090.
  4. Baris 4 (cat app.conf.bak): memperlihatkan isi sebelum disunting, masih 8080.

Dengan sed, penggantian dan penghapusan berlangsung baris demi baris. Ketika kebutuhannya naik kelas — memilih kolom, membandingkan angka, menjumlahkan, membuat laporan berformat — kita butuh alat yang memahami struktur baris: awk, materi chapter berikutnya. Rujukan lengkap semua perintah sed tersedia di halaman manual sed(1) .