Cómo sed y reemplazar cadenas con una ruta de carpeta

14

Estoy tratando de escribir el siguiente script bash:

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;

La línea que quiero cambiar en los archivos es esta:

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"

Entonces el resultado final debe ser:

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"

Pero no entiendo eso ... Supongo que se debe a los caracteres de escape ...

¿Alguien puede arrojar algo de luz?

Gracias

Felipe Caldas
fuente
quieres decir algo de luz
Alexandre Holden Daly

Respuestas:

23

En circunstancias en las que la cadena de reemplazo o la cadena de patrón contienen barras, puede utilizar el hecho de que GNU sed permite un delimitador alternativo para el comando sustituto. Las opciones comunes para el delimitador son el carácter de canalización |o el hash #: la mejor opción para delimitar caracteres a menudo dependerá del tipo de archivo que se procese. En tu caso puedes probar

sed -i "s#_HOME_DIR_#$HOME_DIR#"

También tenga en cuenta que escribió mal su nombre de variable $ HOME_DIR (no comienza con un guión bajo).

$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf

Solo para su información, es posible que desee evitar el uso de mayúsculas para las variables de usuario en su script; deben reservarse para las variables del sistema. Además, el gcambio no es necesario a menos que desee realizar reemplazos múltiples en una sola línea.

conductor de acero
fuente
0

La codificación de la variable 'opt / home' funcionará de esta manera ...

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
user_of_ubuntu_linux
fuente