Como eu uso variáveis em um comando sed?

232

Eu tentei o seguinte código para substituir QQ por ZZ , mas ele não faz o que eu quero:

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

No entanto, esse código faz o que eu quero:

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

Como uso variáveis em sed ?

    
por UAdapter 07.11.2011 / 17:30

2 respostas

317

O shell é responsável por expandir variáveis. Quando você usa aspas simples para seqüências de caracteres, seu conteúdo será tratado literalmente, então sed agora tenta substituir todas as ocorrências do literal $var1 por ZZ .

Usando aspas duplas

Use aspas duplas para fazer o shell expandir as variáveis preservando os espaços em branco:

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

Quando você precisar do caractere de aspas na string de substituição, terá que precedê-lo com uma barra invertida que será interpretada pelo shell. No exemplo a seguir, a string quote me será substituída por "quote me" (o caractere & é interpretado por sed ):

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

Usando aspas simples

Se você tiver muitos meta-caracteres do shell, considere usar aspas simples para o padrão e aspas duplas para a variável:

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

Observe como eu uso s,pattern,replacement, em vez de s/pattern/replacement/ , eu fiz isso para evitar interferência com o / em sed/ .

Exemplo

O shell executa o comando acima pattern=bert com os próximos argumentos (assumindo file=text.txt e file.txt ):

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

Se bert contiver %code% , a saída será:

sed -i 's,'"$pattern"',Say hurrah to &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: %pre%/
/, text.txt
/,' "$file"
    
por Lekensteyn 07.11.2011 / 18:20
98

Podemos usar variáveis em sed usando aspas duplas:

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

Se você tiver uma barra / na variável, use um separador diferente, como abaixo:

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