Pertanyaan Bagaimana saya menggunakan variabel dalam perintah sed?


Saya mencoba kode berikut untuk menggantikan QQ dengan 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 menggunakan variabel dalam sed?


178
2017-11-07 16:30


asal


Lihat jawaban saya di posting Anda ini - ata
terkait: stackoverflow.com/questions/407523/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Jawaban:


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

Menggunakan tanda kutip ganda

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

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

Ketika Anda membutuhkan karakter kutipan dalam string pengganti, Anda harus mengawali dengan backslash yang akan ditafsirkan oleh shell. Dalam contoh berikut, string quote me akan diganti 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 menggunakannya s,pattern,replacement, dari pada 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):

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

Jika file.txt mengandung bert, hasilnya adalah:

Say hurrah to bert: \0/

252
2017-11-07 17:20



Bagaimana seseorang akan melewati opsi "/ g" menggunakan formulir terpisah koma ini? - blong
@ b.panjang Ini a g pilihan, jadi Anda akan lulus s,foo,bar,g sebagai gantinya. - Lekensteyn
contoh kutipan tunggal Anda sangat berguna, mencakup sed menggunakan pola regex cukup baik! - Brian Thomas
Jika Anda tergoda untuk menggunakannya \\0 dari pada \0, seharusnya tidak dilakukan kapan \0 diapit dengan tanda kutip tunggal. Jika tidak sed akan menggantikan pola untuk literal \0 bukannya seluruh pertandingan. - Lekensteyn


Kami 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

78
2017-08-07 15:29