¿Cómo uso las variables en un comando sed?

195

Probé el siguiente código para reemplazar QQ con ZZ , pero no hace lo que quiero:

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

Sin embargo, este código hace lo que quiero:

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

¿Cómo uso las variables en sed ?

    
pregunta UAdapter 07.11.2011 - 17:30

2 respuestas

272

El shell es responsable de expandir las variables. Cuando usa comillas simples para cadenas, su contenido se tratará literalmente, por lo que sed ahora intenta reemplazar cada aparición del literal $var1 por ZZ .

Usando comillas dobles

Use comillas dobles para hacer que el shell expanda las variables mientras preserva los espacios en blanco:

sed -i "s/$var1/ZZ/g" "$file"

Cuando requiera el carácter de comillas en la cadena de reemplazo, debe precederlo con una barra invertida que será interpretada por el shell. En el siguiente ejemplo, la cadena quote me se reemplazará por "quote me" (el carácter & se interpreta por sed ):

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

Usando comillas simples

Si tiene muchos meta-caracteres de shell, considere usar comillas simples para el patrón y comillas dobles para la variable:

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 cómo uso s,pattern,replacement, en lugar de s/pattern/replacement/ , lo hice para evitar interferencias con / en sed/ .

Ejemplo

El shell ejecuta el comando anterior pattern=bert con los siguientes argumentos (asumiendo que file=text.txt y file.txt ):

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

Si bert contiene %code% , la salida será:

sed -i 's,'"$pattern"',Say hurrah to &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: %pre%/
/, text.txt
/,' "$file"
    
respondido por el Lekensteyn 07.11.2011 - 18:20
84

Podemos usar variables en sed usando comillas dobles:

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

Si tiene una barra inclinada / en la variable, use un separador diferente, como a continuación:

sed -i "s|$var|r_str|g" file_name
    
respondido por el mani 07.08.2014 - 17:29

Lea otras preguntas en las etiquetas