Comment sed et remplacer la chaîne par un chemin de dossier

14

J'essaie d'écrire le script bash suivant:

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

La ligne que je souhaite modifier dans les fichiers est la suivante:

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

Le résultat final doit donc être:

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

Mais je ne comprends pas ça ... Je suppose que c'est à cause des caractères d'échappement ...

Quelqu'un peut-il nous éclairer?

Merci

Felipe Caldas
la source
tu veux dire, s (h) ed un peu de lumière
Alexandre Holden Daly

Réponses:

23

Dans les cas où la chaîne de remplacement ou la chaîne de modèle contient des barres obliques, vous pouvez utiliser le fait que GNU sed autorise un délimiteur alternatif pour la commande de substitution. Les choix courants pour le délimiteur sont le caractère de canal |ou le hachage #- le meilleur choix de caractère de délimitation dépendra souvent du type de fichier traité. Dans votre cas, vous pouvez essayer

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

Notez également que vous avez mal saisi le nom de votre variable $ HOME_DIR (il ne commence pas par un trait de soulignement).

$ 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

Juste pour info, vous voudrez peut-être éviter d'utiliser des majuscules pour les variables utilisateur dans votre script - elles doivent être réservées aux variables système. De plus, le gchangement n'est pas nécessaire, sauf si vous souhaitez effectuer plusieurs remplacements sur une seule ligne.

tournevis
la source
0

Le codage en dur de la variable «opt / home» fonctionnera comme ceci.

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