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"