Como uso variáveis ​​em um comando sed?

Respostas:

358

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.

Usando aspas duplas

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"

Usando aspas simples

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/.

Exemplo

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/
Lekensteyn
fonte
2
Como passar a opção "/ g" usando este formulário separado por vírgula?
blong
6
@ b.long É uma gopção, então você passaria s,foo,bar,g.
Lekensteyn
1
seu exemplo de aspas simples é particularmente útil, abrange o sed usando o padrão regex muito bem!
Brian Thomas
Você está tentado a usar \\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.
Lekensteyn
Fiz o truque para mim.
jimh
114

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
mani
fonte
7
Se você tem uma barra /na variável => Isso me salvou! Minha variável é um URL e contém /. Mudar para usar |como separador fixo meu problema
sonlexqt
Polegar para "se você tem uma barra na variável"
Tiina