Jak mohu použít proměnné v příkazu sed?

184

Zkusil jsem následující kód nahraditQQ sZZ, ale nedělá to, co chci:

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

Tento kód však dělá to, co chci:

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

Jak mohu použít proměnné vsed?

    
dané UAdapter 07.11.2011 17:30

2 odpovědi

256

Shell je zodpovědný za rozšiřování proměnných. Když používáte jednoduché uvozovky pro řetězce, bude jejich obsah zacházeno doslovně, takžesed se nyní pokusí nahradit každý výskyt doslovného$var1 byZZ.

Použití dvojitých uvozovek

Použijte dvojité uvozovky, aby se shell rozšířil s proměnnými při zachování prázdných polí:

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

Pokud požadujete znaky citací v nahrazujícím řetězci, musíte předcházet znakem, který bude interpretován skořepinou. V následujícím příkladu bude řetězecquote me nahrazen"quote me" (znak& je interpretovánsed):

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

Použití jednoduchých uvozovek

Pokud máte mnoho meta-charakterizujících znaků, zvažte použití jednoduchých uvozovek pro vzorek a uvozovek u proměnné:

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

Všimněte si, že používáms,pattern,replacement, namístos/pattern/replacement/, udělal jsem to, aby se zabránilo rušení/ vsed/.

Příklad

Pak shell spustí výše uvedený příkazpattern=bert s dalšími argumenty (za předpokladufile=text.txt afile.txt):

%pr_dfe%

Pokudbert obsahuje%co_kde%, výstup bude:

%pr_dfe%     
odpověděl Lekensteyn 07.11.2011 18:20
81

Můžeme použít proměnné vsed pomocí dvojitých uvozovek:

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

Pokud máte v proměnné lomítko/, použijte jiný oddělovač, jak je uveden níže:

sed -i "s|$var|r_str|g" file_name
    
odpověděl mani 07.08.2014 17:29