GNU/Linux >> Belajar Linux >  >> Linux

Cara Menggunakan sed untuk Menemukan dan Mengganti String di File

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 memberitahu sed 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 pertama SEARCH_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.txt
123 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.


Linux
  1. Gunakan Perintah SED untuk Menemukan dan Mengganti String di File - Bagaimana cara melakukan tugas ini di Ubuntu?

  2. Gunakan Temukan dan Temukan untuk mencari file di Linux

  3. Cara Menggunakan Perintah find Linux untuk Menemukan File

  1. Menggunakan grep dan sed untuk mencari dan mengganti string

  2. Cara mengganti string dalam banyak file di baris perintah linux

  3. Bagaimana cara chmod dan chown file tersembunyi di Linux?

  1. Cara menggunakan FIND di Linux

  2. Cara Menemukan File Dengan Izin SUID dan SGID di Linux

  3. Menggunakan sed untuk menemukan dan mengganti file teks di Linux