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?

UAdapter
sumber
terkait: stackoverflow.com/questions/407523/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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/
Lekensteyn
sumber
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
mani
sumber
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