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

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

var1=QQsed -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?

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.

Uso de comillas dobles

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

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

Cuando necesite el carácter de comillas en la cadena de reemplazo, debe precederlo con una barra invertida que será interpretada por el shell. En el ejemplo siguiente, la cadena quote me será reemplazado por "quote me" (caracter & es interpretado por sed):

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

Uso de comillas simples

Si tiene muchos metacaracteres, considere usar comillas simples para el patrón y comillas dobles para la variable:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

Observe cómo uso s,pattern,replacement, en lugar de s/pattern/replacement/, Lo hice para evitar interferencias con el / en \0/.

Ejemplo

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

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

Si file.txt contener bert, la salida será:

Say hurrah to bert: \0/

Podemos usar variables en sed uso de comillas dobles:

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

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

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

Para expandir (juego de palabras) en respuesta de @mani,

  • esta solución funcionará para expresiones regulares alimentadas a otros comandos, como perl
  • use comillas dobles alrededor de la expresión regular (sí, incluso en sistemas Unixy) para expandir la variable como se esperaba
  • | también puede aparecer en el valor de su variable, así que no tenga miedo de probar con otros delimitadores

mira mi respuesta en este post tuyo

relacionado con: Escape a string for a sed replace pattern - Stack Overflow