Bagaimana cara menggunakan variabel dalam perintah sed?

Saya mencoba kode berikut untuk menggantikan QQ dengan ZZ, tapi itu tidak melakukan apa yang saya inginkan:

var1=QQsed -i 's/$var1/ZZ/g' $file

Namun, kode ini melakukan apa yang saya inginkan:

sed -i 's/QQ/ZZ/g' $file

Bagaimana cara menggunakan variabel dalam sed?

Shell bertanggung jawab untuk memperluas variabel. Bila Anda menggunakan tanda kutip tunggal untuk string, isinya akan diperlakukan secara harfiah, jadi sed sekarang mencoba untuk mengganti setiap kejadian literal $var1 oleh ZZ.

Menggunakan tanda kutip ganda

Gunakan tanda kutip ganda untuk membuat shell memperluas variabel sambil mempertahankan spasi:

sed -i "s/$var1/ZZ/g" "$file"

Ketika Anda membutuhkan karakter kutipan dalam string pengganti, Anda harus mendahuluinya dengan garis miring terbalik yang akan ditafsirkan oleh shell. Dalam contoh berikut, string quote me akan digantikan oleh "quote me" (karakter & ditafsirkan oleh sed):

sed -i "s/quote me/\"&\"/" "$file"

Menggunakan tanda kutip tunggal

Jika Anda memiliki banyak meta-karakter shell, pertimbangkan untuk menggunakan tanda kutip tunggal untuk pola, dan tanda kutip ganda untuk variabel:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

Perhatikan bagaimana saya menggunakan s,pattern,replacement, alih-alih s/pattern/replacement/, Saya melakukannya untuk menghindari gangguan pada / di \0/.

Contoh

Shell kemudian menjalankan perintah di atas sed dengan argumen berikutnya (dengan asumsi pattern=bert dan file=text.txt):

-is,bert,Say hurrah to &: \0/,text.txt

Jika file.txt berisi bert, outputnya akan menjadi:

Say hurrah to bert: \0/

Kita dapat menggunakan variabel dalam sed menggunakan tanda kutip ganda:

sed -i "s/$var/r_str/g" file_name

Jika Anda memiliki garis miring / dalam variabel kemudian gunakan pemisah yang berbeda, seperti di bawah ini:

sed -i "s|$var|r_str|g" file_name

Untuk memperluas (pun intended) pada jawaban @ mani,

  • solusi ini akan berfungsi untuk ekspresi reguler yang diumpankan ke perintah lain, seperti perl
  • gunakan tanda kutip ganda di sekitar regex (ya, bahkan di bawah sistem Unixy) inorder untuk memperluas variabel seperti yang diharapkan
  • | mungkin muncul dalam nilai variabel Anda juga, jadi jangan takut untuk mencoba pembatas lain

Lihat Jawaban Saya di posting ini dari Anda

terkait: Escape a string for a sed replace pattern - Stack Overflow