Android

Cara menggunakan sed untuk menemukan dan mengganti string dalam file

[Pythonic 15] Memecah Sekumpulan Kata dalam Kalimat ke dalam List (Splitting a String) pada Python

[Pythonic 15] Memecah Sekumpulan Kata dalam Kalimat ke dalam List (Splitting a String) pada Python

Daftar Isi:

Anonim

Cukup sering ketika bekerja dengan file teks Anda harus menemukan dan mengganti string teks dalam satu file atau lebih.

Sed a is a t ed ed itor. Itu dapat melakukan manipulasi teks dasar pada file dan input stream seperti pipa. Dengan sed Anda dapat mencari, menemukan dan mengganti, menyisipkan, dan menghapus kata dan garis. Ini mendukung ekspresi reguler dasar dan lanjutan yang memungkinkan Anda untuk mencocokkan pola yang kompleks.

, kita akan berbicara tentang cara menemukan dan mengganti string dengan sed . Kami juga akan menunjukkan kepada Anda bagaimana melakukan pencarian dan penggantian rekursif.

Cari dan Ganti String dengan sed

Ada beberapa versi sed , dengan beberapa perbedaan fungsional di antara mereka. macOS menggunakan versi BSD dan sebagian besar distribusi Linux datang dengan GNU dan pra-instal secara default. Kami akan menggunakan versi GNU.

Bentuk umum mencari dan mengganti teks menggunakan sed mengambil bentuk berikut:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Secara default sed menulis outputnya ke output standar. Pilihan ini memberitahu Anda untuk mengedit file di tempat. Jika ekstensi diberikan (ex -i.bak) cadangan dari file asli akan dibuat. s - Perintah pengganti, mungkin perintah yang paling banyak digunakan di sed. / / / - Karakter pembatas. Itu bisa berupa karakter apa saja tetapi biasanya karakter garis miring ( / ) digunakan. SEARCH_REGEX - String normal atau ekspresi reguler untuk mencari. REPLACEMENT - String pengganti. g - Bendera pengganti global. Secara default, sed membaca file baris demi baris dan hanya mengubah kemunculan pertama SEARCH_REGEX pada satu baris. Ketika bendera pengganti disediakan, semua kemunculan akan diganti. INPUTFILE - Nama file yang ingin Anda jalankan perintahnya.

Ini adalah praktik yang baik untuk menempatkan tanda kutip di argumen sehingga karakter meta shell tidak akan berkembang.

Mari kita lihat contoh cara menggunakan perintah sed untuk mencari dan mengganti teks dalam file dengan beberapa opsi dan flag yang paling umum digunakan.

Untuk tujuan demonstrasi, kami akan menggunakan file berikut:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Dengan bendera pengganti global dan 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 telah Anda perhatikan, pada contoh sebelumnya foo substring di dalam string foobar juga diganti. 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 case match pola tidak sensitif, gunakan bendera I Pada contoh di bawah ini kita menggunakan flag g dan I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

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. Sebagian besar 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 angka 3 digit dan menggantinya dengan number string yang akan Anda gunakan:

sed -i 's/\b\{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 {} sekitar setiap 3 digit angka, ketik:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Terakhir namun tidak kalah pentingnya, selalu merupakan ide bagus untuk membuat cadangan saat mengedit file dengan sed . Untuk melakukan itu cukup berikan ekstensi ke opsi -i . Misalnya, untuk mengedit file.txt dan menyimpan file asli sebagai file.txt.bak yang akan Anda gunakan:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Cari dan Ganti Rekursif

Kadang-kadang Anda 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 secara rekursif menemukan file dalam direktori dan mem-piping 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 mengandung spasi dalam nama mereka gunakan opsi -print0 yang memberitahu find untuk mencetak nama file, diikuti oleh karakter nol dan pipa keluaran ke sed menggunakan xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Untuk mengecualikan direktori gunakan opsi -not -path . Misalnya, jika Anda mengganti sebuah 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'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Pilihan lain adalah dengan menggunakan perintah grep untuk secara rekursif menemukan semua file yang mengandung pola pencarian dan kemudian menyalurkan nama file ke sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Kesimpulan

Meskipun mungkin terlihat rumit dan kompleks, pada awalnya, mencari dan mengganti teks dalam file dengan sed sangat sederhana.

Untuk mempelajari lebih lanjut tentang perintah, opsi, dan flag, kunjungi manual sed GNU dan tutorial Grymoire. Jika Anda memiliki pertanyaan atau umpan balik, jangan ragu untuk meninggalkan komentar.

terminal sed