He probado el siguiente código para reemplazar QQ
con 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
?
He probado el siguiente código para reemplazar QQ
con 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:
El shell es responsable de expandir las variables. Cuando utiliza comillas simples para cadenas, su contenido se tratará literalmente, por lo que sed
ahora intenta reemplazar cada aparición del literal $var1
por ZZ
.
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 me
será reemplazada por "quote me"
(el carácter &
es interpretado por sed
):
sed -i "s/quote me/\"&\"/" "$file"
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/
.
El shell luego ejecuta el comando anterior sed
con los siguientes argumentos (suponiendo pattern=bert
y file=text.txt
):
-i
s,bert,Say hurrah to &: \0/,
text.txt
Si file.txt
contiene bert
, la salida será:
Say hurrah to bert: \0/
g
opción, por lo que pasaría en su s,foo,bar,g
lugar.
\\0
lugar de \0
hacerlo, no debe hacerlo cuando \0
se incluye entre comillas simples. De sed
lo contrario , sustituirá el patrón por un literal en \0
lugar de la coincidencia completa.
Podemos usar variables al sed
usar 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
/
en la variable => ¡Esto me salvó! Mi variable es una url y contiene /
. Cambiar a usar |
como separador solucionó mi problema