Hogyan használhatok változókat egy sed parancsban?

184

Megpróbáltam a következő kódot helyettesíteniQQ -alZZ -al, de nem csinál amit akarok:

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

Ez a kód azonban azt teszi, amit akarok:

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

Hogyan használhatom ased? változókat?

    
készlet UAdapter 07.11.2011 17:30
forrás

2 válasz

257

A shell felelős a változók bővítéséért. Ha a karakterláncokra vonatkozó egyetlen idézetet használ, annak tartalmát szó szerint fogják kezelni, ezért ased most megpróbálja kicserélni a$var1%ZZ szó szerinti összes előfordulását.

Dupla idézőjelek használata

Használjon dupla idézőjeleket, hogy a héj kibővítse a változókat, miközben megőrizte a fehérek méretét:

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

Ha a helyettesítő karakterláncban szerepel az idézet karakter, meg kell előznie azt egy visszalépéssel, amelyet a shell fogja értelmezni. A következő példában aquote me karakterláncot"quote me" helyettesítjük (a& karaktertsed értelmezi):

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

Egyéni idézetek használata

Ha sok meta-karakter van, fontolja meg a minta egy idézőjelének használatát, és a változó kétszeres idézőjeleit:

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

Figyeld meg, hogy as,pattern,replacement, helyett as/pattern/replacement/ helyett/ -ot használok, hogy elkerüljem ased/ -banpattern=bert -ben történő beavatkozást.

Példa

A shell ezt követően afile=text.txt parancsot futtatja a következő argumentumokkal (feltételezvefile.txt ésbert):

%pr_dfe%

Ha%co_kde%%co_kde% -ot tartalmaz, a kimenet:

%pr_dfe%     
válasz adott Lekensteyn 07.11.2011 18:20
forrás
81

Változókat használhat ased -ban a kettős idézetek használatával:

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

Ha a változó/ értéket tartalmaz, használja a különböző szeparátorokat, például az alábbiak szerint:

sed -i "s|$var|r_str|g" file_name
    
válasz adott mani 07.08.2014 17:29
forrás