Si se basa en una línea y solo se debe reemplazar una línea, recomiendo anteponer el archivo con la línea de reemplazo usando printf, almacenar esa primera línea en sedel espacio de espera y soltarla según sea necesario. De esta manera, no tiene que preocuparse por caracteres especiales en absoluto. (La única suposición aquí es que $VARcontiene una sola línea de texto sin líneas nuevas, que es lo que ya dijo en los comentarios). Además de las líneas nuevas, VAR podría contener cualquier cosa y esto funcionaría independientemente.
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/KEYWORD/g'
printf '%s\n'imprimirá el contenido de $VARcomo una cadena literal, independientemente de su contenido, seguido de una nueva línea. ( echoen algunos casos, hará otras cosas, por ejemplo, si el contenido de $VARcomienza con un guión, se interpretará como un indicador de opción al que se pasa echo).
Las llaves se usan para anteponer la salida de printflos contenidos de a somefilemedida que se pasan sed. El espacio en blanco que separa las llaves por sí mismos es importante aquí, al igual que el punto y coma antes de la llave de cierre.
1{h;d;};como sedcomando almacenará la primera línea de texto en sedel espacio de espera y luego delegirá la línea (en lugar de imprimirla).
/KEYWORD/aplica las siguientes acciones a todas las líneas que contienen KEYWORD. La acción es get, que obtiene el contenido del espacio de espera y lo coloca en lugar del espacio del patrón; en otras palabras, la línea actual completa. (Esto no es para reemplazar solo una parte de una línea.) El espacio de espera no se vacía, por cierto, solo se copia en el espacio del patrón, reemplazando lo que esté allí.
Si desea anclar su expresión regular para que no coincida con una línea que simplemente contiene KEYWORD, sino solo una línea donde no hay nada más en la línea que KEYWORD, agregue un ancla de inicio de línea ( ^) y un ancla de final de línea ( $) a tu expresión regular:
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/^KEYWORD$/g'
sedy hacer que no sean especiales, simplemente barra diagonal inversa escapar de ellos.VAR='hi\/'No da tal problema.