Bagaimana cara menggunakan variabel dalam perintah sed?


266

Aku mencoba kode berikut untuk mengganti QQdengan ZZ, tetapi tidak melakukan apa yang saya inginkan:

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

Namun, kode ini melakukan apa yang saya inginkan:

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

Bagaimana cara saya menggunakan variabel sed?



Jawaban:


358

Shell bertanggung jawab untuk memperluas variabel. Ketika Anda menggunakan tanda kutip tunggal untuk string, isinya akan diperlakukan secara harfiah, jadi sedsekarang cobalah untuk mengganti setiap kemunculan literal $var1dengan ZZ.

Menggunakan tanda kutip ganda

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

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

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

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

Menggunakan tanda kutip tunggal

Jika Anda memiliki banyak karakter meta 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 \0/.

Contoh

Shell kemudian menjalankan perintah di atas seddengan argumen berikutnya (dengan asumsi pattern=bertdan file=text.txt):

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

Jika file.txtberisi bert, hasilnya akan menjadi:

Say hurrah to bert: \0/

2
Bagaimana cara seseorang meneruskan opsi "/ g" menggunakan formulir yang dipisahkan koma ini?
— blong

6
@ b.panjang Ini adalah gopsi, jadi Anda akan lulus s,foo,bar,gsebagai gantinya.
— Lekensteyn

1
Contoh kutipan tunggal Anda sangat berguna, mencakup dengan menggunakan pola regex dengan cukup baik!
— Brian Thomas

Dalam kasus Anda tergoda untuk menggunakan \\0bukan \0, itu tidak boleh dilakukan ketika \0tertutup dalam tanda kutip tunggal. Kalau tidak, sedakan menggantikan pola untuk literal, \0bukan seluruh pertandingan.
— Lekensteyn

Apakah trik untuk saya.
— jimh

114

Kita dapat menggunakan variabel dalam sedmenggunakan tanda kutip ganda:

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

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

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

7
Jika Anda memiliki garis miring /pada variabel => Ini menyelamatkan saya! Variabel saya adalah url dan berisi /. Beralih untuk digunakan |sebagai pemisah memperbaiki masalah saya
— sonlexqt

Jempol untuk "jika Anda memiliki garis miring dalam variabel"
— Tiina
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.