Eu tentei o seguinte código para substituir QQ
com 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 QQ
com 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, sed
agora tenta substituir todas as ocorrências do literal $var1
por 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 me
será 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 sed
com os próximos argumentos (assumindo pattern=bert
e file=text.txt
):
-i
s,bert,Say hurrah to &: \0/,
text.txt
Se file.txt
contiver bert
, a saída será:
Say hurrah to bert: \0/
g
opçã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 \0
vez de por toda a correspondência.
Podemos usar variáveis 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
/
na variável => Isso me salvou! Minha variável é um URL e contém /
. Mudar para usar |
como separador fixo meu problema