Dalam artikel sebelumnya, saya membahas cara memanipulasi teks dengan grep
. Sekarang, alihkan perhatian Anda ke sed
(Stream Editor), yang paling cocok untuk digunakan dalam pipeline (data yang berasal dari pipa). sed
utilitas dapat digunakan untuk mencetak konten file, mengganti satu baris (atau beberapa baris), dan kemudian menyimpan file. Berbeda dengan grep
, sed
dapat mengganti satu baris atau beberapa baris dalam file dan melakukan di tempat pembaruan file itu.
sed
. yang paling sederhana doa saat mengganti foo
untuk bar
adalah:
$ sed 's/foo/bar/' inputfile
Contoh:Hapus komentar
Sementara grep
dapat memformat output di layar, tidak dapat memodifikasi file di tempat. Untuk melakukan ini, Anda memerlukan editor file seperti ed
. Sejak ed
bukan bagian dari artikel ini, gunakan sed
untuk mencapai hal yang sama yang Anda lakukan dengan grep
dalam contoh pertama artikel sebelumnya. Kali ini ubah /etc/fstab
file di tempat melewati -i
tandai ke sed
. Tanpa -i
flag , Anda hanya akan melihat apa yang telah dimodifikasi.
Anda dianjurkan untuk selalu menjalankan sed
tanpa -i
bendera, hanya untuk memastikan bahwa hasil yang dihasilkannya diharapkan. sed
utilitas juga menawarkan -i.bak
flag, yang membuat file cadangan sebelum diedit.
grep
final terakhir perintah untuk contoh ini adalah:
$ grep -v '^#' /etc/fstab > ~/fstab_without_comment
Dengan sed
, Anda memiliki:
# sed -i '/^#/d' /etc/fstab
/dev/mapper/VGCRYPTO-ROOT / ext4 defaults,x-systemd.device-timeout=0 1 1
UUID=e9de0f73-ddddd-4d45-a9ba-1ffffa /boot ext4 defaults 1 2
LABEL=SSD_SWAP swap swap defaults 0 0
Contoh:Cetak saja /etc/passwd
pengguna
Di grep
misalnya, Anda hanya mencetak nama pengguna dari /etc/passwd
file dengan yang berikut:
$ grep -Eo '^[a-zA-Z_-]+' /etc/passwd
Anda dapat melakukan hal yang sama menggunakan sed
sebagai berikut:
$ sed 's/^\([a-zA-Z_-]\+\).*/\1/' /etc/passwd
Dalam contoh di atas, Anda mengelompokkan kecocokan dengan tanda kurung ()
, lalu cetak grup yang cocok dengan \1
(referensi balik), yang menentukan kelompok pertama. Untuk grup kedua, Anda akan menggunakan \2
, dan seterusnya.
Contoh:Ganti semua foo
dengan bar
Di sed
, Anda dapat menelusuri pola, lalu hanya mengganti kemunculan yang cocok dengan pola tersebut. Untuk mengganti semua kemunculan dalam file inputfile1
dari foo
ke bar
secara global, jalankan:
$ sed -i '/foo/bar/g' inputfile1
Contoh:Ganti satu instance
Ambil file inputfile2
, yang isinya sebagai berikut:
hello world
second line should be replaced
this line should be replaced later
Katakan bahwa Anda ingin mengganti should
dengan will
, tetapi hanya untuk baris kedua. Perintah ini dipecah sebagai berikut:
$ sed '/second/s/should/will/' inputfile2
| | | |
| | | with this pattern
| | this pattern
| substitute
Search for the pattern "second"
Output ini dikirim ke output standar daripada mengganti isi file. Hasilnya terlihat seperti ini:
$ sed '/second/s/should/will/' inputfile2
hello world
second line will be replaced
this line should be replaced later
sed
perintah peka huruf besar-kecil. Berikut ini tidak akan berfungsi saat Anda mencoba mengganti World
dengan there
:
$ echo "Hello World" | sed 's/world/there/'
Hello World
GNU sed
memperkenalkan bendera baru, /I
, yang mengabaikan kasus dan akan lakukan penggantian dengan perintah yang sama:
$ echo "Hello World" | sed 's/world/there/I'
Hello there
Contoh:Cetak rentang baris dan keluar
Dengan sed
, Anda juga dapat mencetak baris dan keluar setelah kriteria Anda terpenuhi. Perintah berikut akan mencetak tiga baris dan keluar. Perintah ini:
$ sed -n '1,3p' /etc/passwd
setara dengan:
$ sed '3q' /etc/passwd
Berikut ini akan salah:
$ sed '1,3q' /etc/passwd # Wrong. You cannot quit three times
Contoh:Beri komentar pada baris yang tidak diberi komentar
Ekspresi reguler juga dapat digunakan dengan sed
, seperti yang ditunjukkan sebelumnya. Misalnya, Anda memiliki skrip kecil berikut:
$ cat test_script
#/usr/bin/env bash
this is the first comment
This is another comment
# this is a comment too
echo "This is not a comment and should be echoed"
Anda sekarang harus melewati baris pertama, dimulai dengan #!/bin/bash
, dan komentari baris ketiga dan keempat, tetapi bukan baris kelima karena baris itu sudah dikomentari.
Di sed
, Anda dapat menggunakan sesuatu seperti berikut:
$ sed '3,6s/^[^#]/# &/g' test_script
#/usr/bin/env bash
# this is the first comment
# This is another comment
# this is a comment too
echo "This is not a comment and should be echoed"
Pada perintah di atas, berikut ini dilakukan:
3,6s
mendefinisikan rentang, dari baris tiga hingga baris enam./^[^#]/
cocok dengan semua yang berupa karakter dan tidak dimulai dengan hash (#
)./# &/g
menggantikan bagian, dalam hal ini menempatkan#
di depan baris yang ditentukan oleh&
tanda tangan.
Contoh:Hapus semua digit
Aplikasi yang berbeda menghasilkan data dalam format yang berbeda. Dengan sed
, Anda hanya dapat menyimpan data yang dapat digunakan. Misalnya, Anda memiliki file berikut (inputfile3
) dalam format ini:
foo1234
bar99128
baz2842
qux12953
discard39120
Mungkin program menghasilkan format yang salah, atau menggabungkan bidang menjadi satu. Bagaimana jika Anda hanya tertarik untuk mempertahankan karakter alfa dan ingin membuang angkanya? Bagaimana Anda mencapai tujuan ini dengan sed
?
Jawabannya mungkin lebih mudah dari yang Anda pikirkan:
$ sed 's/\([a-z]*\).*/\1/' inputfile3
foo
bar
baz
qux
discard
Contoh:Ubah baris tertentu
Selanjutnya, sed
juga dapat menangani rentang berdasarkan pola, yang berarti Anda dapat menentukan awal dan akhir string dan memanipulasi rentang. Misalnya:
$ cat inputfile4
hello world
start of the comment
another comment
end of a comment
dont comment this line
nor this line
Berikut sed
perintah akan mengomentari baris yang dimulai dengan start dan diakhiri dengan end :
$ sed '/start/,/end/ s/^/# /' inputfile4
hello world
# start of the comment
# another comment
# end of a comment
dont comment this line
nor this line
Singkirkan juga baris kosong.
$ sed '/start/,/end/ s/^/# /;/^$/d' inputfile4
hello world
# start of the comment
# another comment
# end of a comment
dont comment this line
nor this line
Masih banyak lagi yang bisa sed
dan fitur-fiturnya yang kaya. Untuk dapat sepenuhnya menggunakan sed
's ability, silakan lihat halaman dokumentasinya, yang dapat Anda temukan di sini. Juga, sumber informasi yang bagus tentang sed
dapat ditemukan di sini.
Penutup
Seperti yang telah saya bahas sebelumnya, Anda akan menggunakan grep
ketika Anda ingin mencari pola, baik dalam file atau beberapa direktori secara rekursif. Gunakan sed
jika Anda menerima data dari pipeline, atau ingin memanipulasi data dengan cepat.
sed
perintah ditulis dan mudah dipelajari untuk melakukan operasi dasar. Yang Anda butuhkan hanyalah latihan, terutama dengan ekspresi reguler.