Questão Como eu uso variáveis ​​em um comando 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, esse código faz o que eu quero:

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

Como eu uso variáveis ​​em sed?


179
2017-11-07 16:30


origem


Vejo minha resposta neste post de vocês - ata
Relacionado: stackoverflow.com/questions/407523/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Respostas:


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

Usando aspas duplas

Use aspas duplas para fazer o shell expandir variáveis ​​enquanto preserva o espaço 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ído por "quote me" (o personagem & é interpretado por sed):

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

Usando aspas simples

Se você tiver muitos meta-caracteres shell, considere o uso de 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 s,pattern,replacement, ao invés de s/pattern/replacement/, Eu fiz isso para evitar interferência com o / dentro \0/.

Exemplo

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

-i
s,bert,Say hurrah to &: \0/,
text.txt

E se file.txt contém bert, a saída será:

Say hurrah to bert: \0/

253
2017-11-07 17:20



Como um passaria a opção "/ g" usando este formulário separado por vírgula? - blong
@ b.long É um g opção, então você passaria s,foo,bar,g em vez de. - Lekensteyn
o seu exemplo de aspas simples é particularmente útil, abrange sed usando o padrão regex muito bem! - Brian Thomas
Caso você esteja tentado a usar \\0 ao invés de \0, não deve ser feito quando \0 é colocado entre aspas simples. De outra forma sed irá substituir o padrão por um literal \0 em vez de todo o jogo. - Lekensteyn


Podemos usar variáveis ​​em sed usando aspas duplas:

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

Se você tem uma barra / na variável então use um separador diferente, como abaixo:

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

79
2017-08-07 15:29