¿Cómo uso variables en un comando sed?


266

He probado el siguiente código para reemplazar QQcon ZZ, pero no hago 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?



Respuestas:


359

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

Usando 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 requiera el carácter de comillas en la cadena de reemplazo, debe precederlo con una barra diagonal inversa que será interpretada por el shell. En el siguiente ejemplo, la cadena quote meserá reemplazada por "quote me"(el carácter &es interpretado por sed):

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

Usando comillas simples

Si tiene muchos metacaracteres de shell, 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 utilizo s,pattern,replacement,en lugar de s/pattern/replacement/, lo hice para evitar interferencias con el /en \0/.

Ejemplo

El shell luego ejecuta el comando anterior sedcon los siguientes argumentos (suponiendo pattern=berty file=text.txt):

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

Si file.txtcontiene bert, la salida será:

Say hurrah to bert: \0/

2
¿Cómo pasaría la opción "/ g" usando esta forma separada por comas?
blong

66
@ b.long Es una gopción, por lo que pasaría en su s,foo,bar,glugar.
Lekensteyn 01 de

1
su ejemplo de comilla simple es particularmente útil, ¡cubre sed usando el patrón de expresiones regulares bastante bien!
Brian Thomas

En caso de que tenga la tentación de usarlo en \\0lugar de \0hacerlo, no debe hacerlo cuando \0se incluye entre comillas simples. De sedlo contrario , sustituirá el patrón por un literal en \0lugar de la coincidencia completa.
Lekensteyn el

Hizo el truco para mí.
Jim

114

Podemos usar variables al sedusar comillas dobles:

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

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

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

77
Si tienes una barra /en la variable => ¡Esto me salvó! Mi variable es una url y contiene /. Cambiar a usar |como separador solucionó mi problema
sonlexqt

Pulgar hacia arriba para "si tienes una barra oblicua en la variable"
Tiina
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.