Saat bekerja dengan file teks, Anda sering harus mencari dan mengganti string teks dalam satu atau beberapa file.
sed
adalah s tream ed itu Itu dapat melakukan manipulasi teks dasar pada file dan aliran input seperti saluran pipa. Dengan sed
, Anda dapat mencari, menemukan dan mengganti, menyisipkan, dan menghapus kata dan baris. Ini mendukung ekspresi reguler dasar dan diperluas yang memungkinkan Anda untuk mencocokkan pola yang kompleks.
Dalam artikel ini, kita akan berbicara tentang cara menemukan dan mengganti string dengan sed
. Kami juga akan menunjukkan cara melakukan pencarian dan penggantian rekursif.
Temukan dan Ganti String dengan sed
#
Ada beberapa versi sed
, dengan beberapa perbedaan fungsional di antara mereka. macOS menggunakan versi BSD, sementara sebagian besar distribusi Linux datang dengan sed
GNU pra-instal secara default. Kami akan menggunakan versi GNU.
Bentuk umum pencarian dan penggantian teks menggunakan sed
mengambil bentuk berikut:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-i
- Secara default,sed
menulis outputnya ke output standar. Opsi ini memberitahused
untuk mengedit file di tempat. Jika ekstensi diberikan (mis. -i.bak), cadangan file asli akan dibuat.s
- Perintah pengganti, mungkin perintah yang paling sering digunakan di sed./ / /
- Karakter pembatas. Ini bisa berupa karakter apa saja tetapi biasanya garis miring (/
) karakter digunakan.SEARCH_REGEX
- String normal atau ekspresi reguler untuk dicari.REPLACEMENT
- String pengganti.g
- Bendera pengganti global. Secara default,sed
membaca file baris demi baris dan hanya mengubah kemunculan pertamaSEARCH_REGEX
pada satu baris. Saat bendera pengganti diberikan, semua kemunculan akan diganti.INPUTFILE
- Nama file tempat Anda ingin menjalankan perintah.
Ini adalah praktik yang baik untuk menempatkan tanda kutip di sekitar argumen sehingga karakter meta shell tidak akan berkembang.
Mari kita lihat bagaimana kita dapat menggunakan sed
perintah untuk mencari dan mengganti teks dalam file dengan beberapa opsi dan tanda yang paling umum digunakan.
Untuk tujuan demonstrasi, kami akan menggunakan file berikut:
file.txt123 Foo foo foo
foo /bin/bash Ubuntu foobar 456
Jika g
bendera dihilangkan, hanya contoh pertama dari string pencarian di setiap baris yang diganti:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo
linux /bin/bash Ubuntu foobar 456
Dengan bendera pengganti global sed
menggantikan semua kemunculan pola pencarian:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linux
linux /bin/bash Ubuntu linuxbar 456
Seperti yang mungkin Anda perhatikan, substring foo
di dalam foobar
string juga diganti pada contoh sebelumnya. Jika ini bukan perilaku yang diinginkan, gunakan ekspresi batas kata (\b
) di kedua ujung string pencarian. Ini memastikan sebagian kata tidak cocok.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linux
linux /bin/bash Ubuntu foobar 456
Untuk membuat pencocokan pola huruf besar/kecil, gunakan I
bendera. Pada contoh di bawah ini kami menggunakan keduanya g
dan I
bendera:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux
linux /bin/bash Ubuntu linuxbar 456
Jika Anda ingin mencari dan mengganti string yang berisi karakter pembatas (/
) Anda harus menggunakan garis miring terbalik (\
) untuk menghindari garis miring. Misalnya untuk mengganti /bin/bash
dengan /usr/bin/zsh
Anda akan menggunakan
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
Opsi yang lebih mudah dan lebih mudah dibaca adalah dengan menggunakan karakter pembatas lainnya. Kebanyakan orang menggunakan bilah vertikal (|
) atau titik dua (:
) tetapi Anda dapat menggunakan karakter lain:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo
foo /usr/bin/zsh Ubuntu foobar 456
Anda juga dapat menggunakan ekspresi reguler. Misalnya, untuk mencari semua 3 digit angka dan menggantinya dengan string number
Anda akan menggunakan:
sed -i 's/\b[0-9]\{3\}\b/number/g' file.txt
number Foo foo foo
foo /bin/bash demo foobar number
Fitur lain yang berguna dari sed adalah Anda dapat menggunakan karakter ampersand &
yang sesuai dengan pola yang cocok. Karakter dapat digunakan beberapa kali.
Misalnya, jika Anda ingin menambahkan kurung kurawal {}
di sekitar setiap 3 digit angka, ketik:
sed -i 's/\b[0-9]\{3\}\b/{&}/g' file.txt
{123} Foo foo foo
foo /bin/bash demo foobar {456}
Last but not least, itu selalu merupakan ide yang baik untuk membuat cadangan saat mengedit file dengan sed
. Untuk melakukannya, cukup berikan ekstensi untuk file cadangan ke -i
pilihan. Misalnya, untuk mengedit file.txt
dan simpan file asli sebagai file.txt.bak
Anda akan menggunakan:
sed -i.bak 's/foo/linux/g' file.txt
Untuk memastikan bahwa cadangan dibuat, daftarkan file dengan ls
perintah:
ls
file.txt file.txt.bak
Temukan dan Ganti Rekursif #
Terkadang Anda mungkin ingin mencari direktori secara rekursif untuk file yang berisi string dan mengganti string di semua file. Ini dapat dilakukan dengan menggunakan perintah seperti find
atau grep
untuk menemukan file secara rekursif dalam direktori dan menyalurkan nama file ke sed
.
Perintah berikut akan secara rekursif mencari file di direktori kerja saat ini dan meneruskan nama file ke sed
.
find . -type f -exec sed -i 's/foo/bar/g' {} +
Untuk menghindari masalah dengan file yang berisi spasi pada namanya, gunakan -print0
opsi, yang memberi tahu find
untuk mencetak nama file, diikuti dengan karakter null dan menyalurkan output ke sed
menggunakan xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
Untuk mengecualikan direktori, gunakan -not -path
pilihan. Misalnya, jika Anda mengganti string di repo git lokal Anda untuk mengecualikan semua file yang dimulai dengan titik (.
), gunakan:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Jika Anda ingin mencari dan mengganti teks hanya pada file dengan ekstensi tertentu, Anda akan menggunakan:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
Pilihan lain adalah dengan menggunakan grep
perintah untuk secara rekursif menemukan semua file yang berisi pola pencarian dan kemudian menyalurkan nama file ke sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Kesimpulan #
Meskipun mungkin tampak rumit dan rumit, pada awalnya, mencari dan mengganti teks dalam file dengan sed
sangat sederhana.
Untuk mempelajari lebih lanjut tentang sed
perintah, opsi, dan flag, kunjungi manual sed GNU dan tutorial Grymoire sed.
Jika Anda memiliki pertanyaan atau masukan, jangan ragu untuk memberikan komentar.