Bir sed komutunda değişkenleri nasıl kullanırım?

Değiştirmek için aşağıdaki kodu denedim QQ ile ZZ ama istediğimi yapmıyor.:

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

Ancak, bu kod istediğimi yapar:

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

Değişkenleri nasıl kullanırım sed?

Kabuk değişkenleri genişletmekten sorumludur. Dizeler için tek tırnak işaretleri kullandığınızda, içeriği tam anlamıyla işlenecektir, bu nedenle sed şimdi değişmezin her oluşumunu değiştirmeye çalışıyor $var1 tarafından ZZ.

Çift tırnak işareti kullanma

Boşluğu korurken kabuğun değişkenleri genişletmesini sağlamak için çift tırnak işaretleri kullanın:

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

Değiştirme dizesinde alıntı karakterine gereksinim duyduğunuzda, kabuk tarafından yorumlanacak bir ters eğik çizgi ile önüne geçmeniz gerekir. Aşağıdaki örnekte, dize quote me ile değiştirilecektir "quote me" (karakter & tarafından yorumlanır sed):

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

Tek tırnak işaretleri kullanma

Çok sayıda kabuk meta karakteriniz varsa, desen için tek tırnak işaretleri ve değişken için çift tırnak işaretleri kullanmayı düşünün:

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

Nasıl kullandığıma dikkat et s,pattern,replacement, yerine s/pattern/replacement/, Ben karışmasını önlemek için yaptım / içinde \0/.

Örnek

Kabuk daha sonra yukarıdaki komutu çalıştırır sed bir sonraki argümanlarla (varsayarak pattern=bert ve file=text.txt):

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

Eğer file.txt içeriyor bert, çıkış olacak:

Say hurrah to bert: \0/

Değişkenleri şu durumlarda kullanabiliriz: sed çift tırnak işareti kullanma:

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

Eğik çizginiz varsa / değişkende, aşağıdaki gibi farklı ayırıcı kullanın:

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

Genişletmek için (cinas amaçlanan) @mani'nin cevabı,

  • bu çözüm, aşağıdaki gibi diğer komutlara beslenen normal ifadeler için çalışacaktır perl
  • değişkeni beklendiği gibi genişletmek için regex çevresinde (evet, Unixy sistemlerinde bile) çift tırnak işareti kullanın
  • | değişkeninizin değerinde de görünebilir, bu nedenle diğer sınırlayıcıları denemekten korkmayın

[bu yazınızdaki cevabıma bakın] (bash - How to escape file path in SED? - Ask Ubuntu )

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