Eu tentei o seguinte código para substituir QQcom ZZ, mas não faz o que eu quero:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
No entanto, este código faz o que eu quero:
sed -i 's/QQ/ZZ/g' $file
Como uso variáveis em sed?
Eu tentei o seguinte código para substituir QQcom ZZ, mas não faz o que eu quero:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
No entanto, este código faz o que eu quero:
sed -i 's/QQ/ZZ/g' $file
Como uso variáveis em sed?
Respostas:
O shell é responsável pela expansão de variáveis. Quando você usa aspas simples para seqüências de caracteres, seu conteúdo será tratado literalmente, sedagora tenta substituir todas as ocorrências do literal $var1por ZZ.
Use aspas duplas para fazer com que o shell expanda variáveis, preservando o espaço em branco:
sed -i "s/$var1/ZZ/g" "$file"
Quando você precisar do caractere de citação na string de substituição, precisará preceder com uma barra invertida que será interpretada pelo shell. No exemplo a seguir, a sequência quote meserá substituída por "quote me"(o caractere &é interpretado por sed):
sed -i "s/quote me/\"&\"/" "$file"
Se você possui muitos metacaracteres shell, considere usar aspas simples para o padrão e aspas duplas para a variável:
sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"
Observe como eu uso, em s,pattern,replacement,vez de s/pattern/replacement/, fiz isso para evitar interferência no /in \0/.
O shell então executa o comando acima sedcom os próximos argumentos (assumindo pattern=berte file=text.txt):
-i
s,bert,Say hurrah to &: \0/,
text.txt
Se file.txtcontiver bert, a saída será:
Say hurrah to bert: \0/
gopção, então você passaria s,foo,bar,g.
\\0, em vez de \0, não deve ser feito quando \0é colocado entre aspas simples. Caso contrário sed, substituirá o padrão por um literal em \0vez de por toda a correspondência.
Podemos usar variáveis sedusando 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
/na variável => Isso me salvou! Minha variável é um URL e contém /. Mudar para usar |como separador fixo meu problema