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

177

QQ değerini ZZ ile değiştirmek için aşağıdaki kodu denedim, ancak istediğimi yapmıyor:

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

Ancak, bu kod istediğimi yapar:

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

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

    
sordu UAdapter 07.11.2011 17:30

2 cevap

252

Kabuk, değişkenleri genişletmekten sorumludur. Dizeler için tek tırnak kullandığınızda, içeriği tam anlamıyla ele alınır, bu nedenle sed artık $var1 dosyasının her kopyasını ZZ ile değiştirmeye çalışır.

Çift tırnak kullanma

Kabuğu boşlukları koruyarak değişkenleri genişletmek için çift tırnak kullanın:

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

Yedek dizgede teklif karakterine ihtiyaç duyduğunuzda, kabuk tarafından yorumlanacak bir ters eğik çizgi ile önüne geçmeniz gerekir. Aşağıdaki örnekte, quote me dizesi "quote me" ile değiştirilecektir ( & karakteri sed tarafından yorumlanır):

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

Tek tırnak işaretleri kullanma

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

sed -i 's,'"$pattern"',Say hurrah to &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: %pre%/
/, text.txt
/,' "$file"

s,pattern,replacement, yerine s/pattern/replacement/ nasıl kullandığımı fark ettim, / içindeki sed/ ile çakışmayı önlemek için yaptım.

Örnek

Kabuk daha sonra pattern=bert komutunu bir sonraki argümanlarla çalıştırır ( file=text.txt ve file.txt değerini varsayarak):

%pre%

bert %code% içeriyorsa, çıkış şöyle olur:

%pre%     
verilen cevap Lekensteyn 07.11.2011 18:20
78

Çift tırnak kullanarak% co_de değişkenindeki değişkenleri kullanabiliriz:

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

Değişkende sed eğik çizgi varsa, aşağıdaki gibi farklı ayırıcı kullanın:

sed -i "s|$var|r_str|g" file_name
    
verilen cevap mani 07.08.2014 17:29

Etiketlerdeki diğer soruları oku