web-dev-qa-db-fra.com

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

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 veux changer 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

14
Felipe Caldas

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 caractère | ou le hash # - le meilleur choix de caractère de délimitation dépendra souvent du type de fichier en cours de traitement. Dans votre cas, vous pouvez essayer

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

Notez également que vous avez mal entré le nom de 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 ça, vous voudrez peut-être éviter d’utiliser des majuscules pour les variables utilisateur dans votre script - elles devraient être réservées aux variables système. De plus, le commutateur g n'est pas nécessaire, sauf si vous souhaitez effectuer plusieurs remplacements sur une seule ligne.

23
steeldriver

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" {} \;
0