Jak używać zmiennych w poleceniu sed?

194

Próbowałem następującego kodu, aby zastąpić QQ przez ZZ , ale nie robi to, co chcę:

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

Jednak ten kod robi to, co chcę:

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

Jak używać zmiennych w sed ?

    
zadawane UAdapter 07.11.2011, 17:30
źródło

2 odpowiedzi

268

Powłoka jest odpowiedzialna za rozwijanie zmiennych. Gdy używasz pojedynczych cudzysłowów dla łańcuchów, jego zawartość będzie traktowana dosłownie, więc sed teraz próbuje zastąpić każde wystąpienie literału $var1 przez ZZ .

Używanie podwójnych cudzysłowów

Użyj podwójnych cudzysłowów, aby powłoka rozwijała zmienne zachowując białe spacje:

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

Gdy potrzebujesz znaku cudzysłowu w łańcuchu zamiennym, musisz poprzedzić go ukośnikiem odwrotnym, który będzie interpretowany przez powłokę. W poniższym przykładzie ciąg quote me zostanie zastąpiony przez "quote me" (znak & jest interpretowany przez sed ):

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

Korzystanie z pojedynczych cudzysłowów

Jeśli masz dużo metaznaków powłoki, rozważ użycie pojedynczych cudzysłowów dla wzorca i podwójnych cudzysłowów dla zmiennej:

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

Zwróć uwagę, że używam s,pattern,replacement, zamiast s/pattern/replacement/ , zrobiłem to, aby uniknąć ingerencji w / w sed/ .

Przykład

Powłoka następnie wykonuje powyższe polecenie pattern=bert z następnymi argumentami (zakładając file=text.txt i file.txt ):

%pre%

Jeśli bert zawiera %code% , wyjście będzie:

%pre%     
odpowiedział Lekensteyn 07.11.2011, 18:20
źródło
84

Możemy używać zmiennych w sed używając podwójnych cudzysłowów:

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

Jeśli masz zmienną / w zmiennej, użyj innego separatora, jak poniżej:

sed -i "s|$var|r_str|g" file_name
    
odpowiedział mani 07.08.2014, 17:29
źródło

Przeczytaj inne pytania na temat tagów