Perintah sed Linux: cari dan ganti teks dengan cadangan
Perintah sed adalah penyunting aliran teks yang membaca masukan, menerapkan aturan penyuntingan, lalu menampilkan hasilnya. Gunakan sed untuk penggantian pola, pemilihan baris, atau penghapusan baris dari keluaran. Secara bawaan, sed menulis ke keluaran standar dan tidak mengubah berkas asal; opsi -i melakukan penyuntingan pada berkas.
Bentuk penggantian dasar adalah s/POLA/PENGGANTI/FLAG. Tanpa flag g, penggantian biasa hanya mengubah kecocokan pertama pada setiap baris. Menambahkan g mengubah semua kecocokan pada baris tersebut. POLA merupakan ekspresi reguler, yaitu notasi untuk mencocokkan pola teks, sehingga tidak semua karakter diperlakukan sebagai huruf biasa.
Sintaks dasar
sed [OPSI]... 'SKRIP_EDIT' [BERKAS]...
OPSI, SKRIP_EDIT, dan BERKAS adalah penanda yang perlu diganti sesuai tujuan. Jika tidak ada nama berkas, sed membaca masukan standar, termasuk data dari pipa. Tanda kutip tunggal pada contoh menjaga agar shell meneruskan skrip sed tanpa mengembangkan karakter seperti $ atau garis miring terbalik.
Contoh berikut menggunakan GNU sed. Periksa sed --version, sed --help, dan man sed pada sistem Anda. Sebagian opsi dan bentuk penyuntingan langsung berbeda pada implementasi lain.
Bandingkan sumber, hasil, cadangan, dan pemulihan
Jalankan seluruh blok ini di Bash atau shell yang mendukung sintaksnya. Blok membuat direktori latihan baru dengan mktemp, lalu menyiapkan semua berkas di dalamnya. Tanda kurung membatasi perubahan direktori pada subshell, sehingga berkas pada direktori kerja semula tidak ditimpa. Lokasi bahan latihan dicetak pada baris terakhir.
(
set -eu
labdir=$(mktemp -d)
cd "$labdir"
printf 'red car\nred red\n' > config.txt
sed 's/red/green/' config.txt > first.txt
sed 's/red/green/g' config.txt > all.txt
cat config.txt first.txt all.txt
cp config.txt editable.txt
sed -i.bak 's/red/green/g' editable.txt
diff -u editable.txt.bak editable.txt || test "$?" -eq 1
cmp config.txt editable.txt.bak
cp editable.txt.bak editable.txt
cmp config.txt editable.txt
printf 'Lab files: %s\n' "$labdir"
)
Cat pada bagian awal menampilkan tiga pasangan baris secara berurutan:
- Berkas
config.txttetap berisired cardanred red. Kedua perintah sed sebelumnya hanya menulis hasilnya ke berkas tujuan yang berbeda. - Berkas
first.txtberisigreen cardangreen red. Tanpa g, hanya red pertama pada tiap baris yang diganti. - Berkas
all.txtberisigreen cardangreen green. Flag g mengganti kedua kemunculan red pada baris kedua.
Perintah sed -i.bak kemudian menyunting editable.txt dan menyimpan isi sebelumnya pada editable.txt.bak. Diff menampilkan perbedaan kedua berkas tersebut; setelah itu, cmp memastikan cadangan sama dengan config.txt. Perintah cp mengembalikan cadangan ke editable.txt, lalu cmp terakhir memastikan pemulihannya benar.
Pada perintah diff, kode keluar 1 berarti ditemukan perbedaan. Bentuk || test "$?" -eq 1 pada blok menerima hasil perbandingan itu, tetapi tidak menganggap semua kesalahan diff sebagai keberhasilan. Cmp yang berhasil biasanya tidak menampilkan teks. Jangan mengandalkan tampilan kosong saja; periksa pula status perintah.
Pilih baris dan gabungkan aturan penyuntingan
Untuk perintah lanjutan di bagian ini, pindah ke direktori yang dicetak setelah teks Lab files:. Misalnya, ganti penanda jalur pada cd "/jalur/latihan-yang-dicetak" dengan lokasi yang benar. Berkas config.txt dari blok tadi masih berisi dua baris asli dan dapat dipakai untuk membandingkan contoh berikut.
Gunakan -n bersama perintah cetak
sed -n '2p' config.txt menampilkan hanya baris kedua, yaitu red red. Opsi -n mematikan pencetakan otomatis, sedangkan 2p meminta baris bernomor 2 dicetak. Untuk memilih baris yang memuat car, sed -n '/car/p' config.txt menghasilkan red car.
Sebaliknya, sed '2d' config.txt menghilangkan baris kedua dari hasil sehingga hanya red car ditampilkan. Perintah d tersebut memengaruhi aliran keluaran; config.txt tetap utuh karena contoh tidak menggunakan -i atau mengalihkan hasil ke jalur asal.
Terapkan beberapa aturan dengan -e
sed -e 's/red/green/g' -e 's/car/bike/' config.txt menghasilkan green bike lalu green green. Aturan diterapkan sesuai urutan yang ditulis: red diganti dahulu, kemudian car diganti pada hasil baris yang sedang diproses.
Opsi -E memilih ekspresi reguler diperluas. Misalnya, printf 'id=12\nid=x\n' | sed -E 's/[0-9]+/N/' menghasilkan id=N lalu id=x. Pada contoh ASCII ini, [0-9]+ mencocokkan satu atau lebih digit. Jangan menyalin pola dari mode ekspresi reguler lain tanpa menyesuaikan aturan dan pengutipannya.
Opsi yang sering digunakan
| Opsi | Kegunaan |
|---|---|
-n |
Matikan pencetakan otomatis; cetak hanya yang diminta oleh skrip, misalnya p. |
-e SKRIP |
Tambahkan aturan penyuntingan; dapat dipakai berulang untuk beberapa aturan. |
-E |
Gunakan ekspresi reguler diperluas. |
-i[AKHIRAN] |
Pada GNU sed, sunting berkas dan buat cadangan jika akhiran diberikan. |
Pada bentuk GNU -i.bak, akhiran cadangan menempel pada -i. Jangan menganggap sintaks itu dapat dipakai tanpa pemeriksaan pada semua implementasi. Contohnya, manual sed FreeBSD mendokumentasikan -i dengan argumen extension. Pilih sintaks berdasarkan sed yang benar-benar dipakai.
Hal yang perlu diperhatikan sebelum mengganti teks
Bedakan ekspresi reguler dan teks harfiah
Tanda titik dalam pola dapat mencocokkan karakter lain, bukan hanya titik literal. Bandingkan printf 'a.b axb\n' | sed 's/a.b/X/g', yang menghasilkan X X, dengan printf 'a.b axb\n' | sed 's/a\.b/X/g', yang menghasilkan X axb. Garis miring terbalik pada pola kedua membuat titik diperlakukan secara harfiah.
Tanda kutip shell tidak menghapus makna khusus ekspresi reguler di dalam sed. Kutip tunggal melindungi skrip dari penafsiran shell, lalu sed masih menafsirkan pola itu menurut aturan ekspresi regulernya. Uji pola pada data kecil yang mewakili isi berkas sebelum menyunting banyak berkas.
Karakter pengganti juga mempunyai makna khusus
Pada sisi PENGGANTI, & berarti seluruh teks yang cocok. Contohnya, printf 'red car\n' | sed 's/red/[&]/' menghasilkan [red] car. Untuk menyisipkan & secara harfiah, gunakan escape yang sesuai, misalnya printf 'red car\n' | sed 's/red/A\&B/' menghasilkan A&B car.
Jika pola atau pengganti mengandung garis miring, Anda dapat memilih delimiter lain. printf '/opt/app\n' | sed 's#/opt#/srv#' menghasilkan /srv/app. Ini mempermudah pembacaan jalur pada contoh, tetapi tidak membuat semua karakter lain otomatis menjadi literal.
Tinjau hasil sebelum memakai -i
Mulailah dengan keluaran ke layar atau berkas tujuan berbeda. Jika akan memakai -i, buat cadangan dan periksa perbedaannya seperti pada blok latihan. Akhiran .bak bukan riwayat versi tanpa batas; pemakaian berikutnya pada jalur cadangan yang sama dapat mengganti cadangan sebelumnya.
Berhati-hatilah saat menggabungkan -n dan -i. Mematikan pencetakan otomatis tanpa mencetak hasil yang diperlukan dapat membuat berkas hasil kosong. Jangan mengalihkan keluaran sed kembali ke masukan yang sama dengan > karena shell dapat mengosongkannya sebelum pembacaan dimulai. Gunakan tujuan terpisah atau mekanisme penyuntingan yang sudah Anda periksa.
Sesudah meninjau hasil, Anda dapat mempertahankan bahan latihan untuk perbandingan atau membersihkan hanya direktori latihan yang lokasinya sudah dipastikan. Contoh ini tidak memerlukan perubahan pada konfigurasi sistem atau berkas penting.
FAQ
Apakah menjalankan sed langsung mengubah berkas asal?
Pemakaian dasar menampilkan hasil tanpa mengubah berkas masukan. Opsi -i menyunting berkas, sedangkan > menulis keluaran ke tujuan yang Anda tentukan. Periksa perintah dan jalur tujuan karena menyimpan hasil ke berkas lain berbeda dari mengganti berkas asal.
Dokumentasi
Opsi GNU dan ringkasan perintah tersedia dalam manual GNU sed yang ditayangkan di man7.




