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 sed
el 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 $VAR
contiene 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 $VAR
como una cadena literal, independientemente de su contenido, seguido de una nueva línea. ( echo
en algunos casos, hará otras cosas, por ejemplo, si el contenido de $VAR
comienza 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 printf
los contenidos de a somefile
medida 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 sed
comando almacenará la primera línea de texto en sed
el espacio de espera y luego d
elegirá la línea (en lugar de imprimirla).
/KEYWORD/
aplica las siguientes acciones a todas las líneas que contienen KEYWORD
. La acción es g
et, 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'
sed
y hacer que no sean especiales, simplemente barra diagonal inversa escapar de ellos.VAR='hi\/'
No da tal problema.